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

Artifact 1462a391952c7659168460fe2d7eed7d41529be1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
0400: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c  Initialize a Sel
0410: 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
0420: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0430: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
0440: 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65  (SelectDest *pDe
0450: 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  st, int eDest, i
0460: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65  nt iParm){.  pDe
0470: 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29  st->eDest = (u8)
0480: 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  eDest;.  pDest->
0490: 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b  iSDParm = iParm;
04a0: 0a 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  .  pDest->affSds
04b0: 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e  t = 0;.  pDest->
04c0: 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65  iSdst = 0;.  pDe
04d0: 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d  st->nSdst = 0;.}
04e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
04f0: 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73  e a new Select s
0500: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
0510: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0520: 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75   that.** structu
0530: 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73  re..*/.Select *s
0540: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
0550: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0560: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
0570: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
0580: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
0590: 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20  t,     /* which 
05a0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75  columns to inclu
05b0: 64 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  de in the result
05c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
05d0: 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74  Src,        /* t
05e0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d  he FROM clause -
05f0: 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74  - which tables t
0600: 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72  o scan */.  Expr
0610: 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
0620: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
0630: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
0640: 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20  ist *pGroupBy,  
0650: 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59   /* the GROUP BY
0660: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0670: 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20  r *pHaving,     
0680: 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47     /* the HAVING
0690: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
06a0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
06b0: 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20     /* the ORDER 
06c0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
06d0: 6e 74 20 69 73 44 69 73 74 69 6e 63 74 2c 20 20  nt isDistinct,  
06e0: 20 20 20 20 20 2f 2a 20 74 72 75 65 20 69 66 20       /* true if 
06f0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
0700: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
0710: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0720: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0730: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0740: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0750: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0760: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0770: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
0780: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
0790: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
07a0: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
07b0: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
07c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
07d0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
07e0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
07f0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0800: 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74  New) );.  assert
0810: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0820: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0830: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0840: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0850: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0860: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0870: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
0880: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
0890: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
08a0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
08b0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
08c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
08d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
08e0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
08f0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0900: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0910: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0920: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0930: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0940: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
0950: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
0960: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
0970: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
0980: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
0990: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
09a0: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
09b0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
09c0: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
09d0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
09e0: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
09f0: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
0a00: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
0a10: 20 3d 20 69 73 44 69 73 74 69 6e 63 74 20 3f 20   = isDistinct ? 
0a20: 53 46 5f 44 69 73 74 69 6e 63 74 20 3a 20 30 3b  SF_Distinct : 0;
0a30: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b  .  pNew->op = TK
0a40: 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d  _SELECT;.  pNew-
0a50: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
0a60: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
0a70: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 61  t = pOffset;.  a
0a80: 73 73 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d  ssert( pOffset==
0a90: 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29  0 || pLimit!=0 )
0aa0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
0ab0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
0ac0: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0ad0: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
0ae0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0af0: 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66  hm[2] = -1;.  if
0b00: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0b10: 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72  ed ) {.    clear
0b20: 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 29  Select(db, pNew)
0b30: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d  ;.    if( pNew!=
0b40: 26 73 74 61 6e 64 69 6e 20 29 20 73 71 6c 69 74  &standin ) sqlit
0b50: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
0b60: 77 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  w);.    pNew = 0
0b70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
0b80: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72  ssert( pNew->pSr
0b90: 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  c!=0 || pParse->
0ba0: 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20  nErr>0 );.  }.  
0bb0: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73  assert( pNew!=&s
0bc0: 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75  tandin );.  retu
0bd0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
0be0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
0bf0: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
0c00: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
0c10: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
0c20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0c30: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
0c40: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
0c50: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
0c60: 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63  {.    clearSelec
0c70: 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 73 71  t(db, p);.    sq
0c80: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0c90: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
0ca0: 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64   Given 1 to 3 id
0cb0: 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 65  entifiers precee
0cc0: 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65  ding the JOIN ke
0cd0: 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65  yword, determine
0ce0: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20   the.** type of 
0cf0: 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  join.  Return an
0d00: 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   integer constan
0d10: 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65 73  t that expresses
0d20: 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e   that type.** in
0d30: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
0d40: 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75  llowing bit valu
0d50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54  es:.**.**     JT
0d60: 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54  _INNER.**     JT
0d70: 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54  _CROSS.**     JT
0d80: 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54  _OUTER.**     JT
0d90: 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20  _NATURAL.**     
0da0: 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a  JT_LEFT.**     J
0db0: 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20  T_RIGHT.**.** A 
0dc0: 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20  full outer join 
0dd0: 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69  is the combinati
0de0: 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e  on of JT_LEFT an
0df0: 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a  d JT_RIGHT..**.*
0e00: 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20  * If an illegal 
0e10: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
0e20: 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e  oin type is seen
0e30: 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74  , then still ret
0e40: 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79  urn.** a join ty
0e50: 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65  pe, but put an e
0e60: 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72  rror in the pPar
0e70: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
0e80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e  .int sqlite3Join
0e90: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
0ea0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54  se, Token *pA, T
0eb0: 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20  oken *pB, Token 
0ec0: 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e  *pC){.  int join
0ed0: 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65  type = 0;.  Toke
0ee0: 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54  n *apAll[3];.  T
0ef0: 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20  oken *p;.       
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f10: 20 20 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34        /*   01234
0f20: 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20  56789 123456789 
0f30: 31 32 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f  123456789 123 */
0f40: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
0f50: 63 68 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20  char zKeyText[] 
0f60: 3d 20 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74  = "naturaleftout
0f70: 65 72 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63  erightfullinnerc
0f80: 72 6f 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20  ross";.  static 
0f90: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
0fa0: 20 20 20 75 38 20 69 3b 20 20 20 20 20 20 20 20     u8 i;        
0fb0: 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20  /* Beginning of 
0fc0: 6b 65 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20  keyword text in 
0fd0: 7a 4b 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20  zKeyText[] */.  
0fe0: 20 20 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f    u8 nChar;    /
0ff0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
1000: 6b 65 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61  keyword in chara
1010: 63 74 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20  cters */.    u8 
1020: 63 6f 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69  code;     /* Joi
1030: 6e 20 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20  n type mask */. 
1040: 20 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20   } aKeyword[] = 
1050: 7b 0a 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c  {.    /* natural
1060: 20 2a 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f   */ { 0,  7, JT_
1070: 4e 41 54 55 52 41 4c 20 20 20 20 20 20 20 20 20  NATURAL         
1080: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1090: 20 6c 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c   left    */ { 6,
10a0: 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f    4, JT_LEFT|JT_
10b0: 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 20 7d  OUTER          }
10c0: 2c 0a 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20  ,.    /* outer  
10d0: 20 2a 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f   */ { 10, 5, JT_
10e0: 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 20 20  OUTER           
10f0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1100: 20 72 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34   right   */ { 14
1110: 2c 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54  , 5, JT_RIGHT|JT
1120: 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 7d  _OUTER         }
1130: 2c 0a 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20  ,.    /* full   
1140: 20 2a 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f   */ { 19, 4, JT_
1150: 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54  LEFT|JT_RIGHT|JT
1160: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a  _OUTER },.    /*
1170: 20 69 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33   inner   */ { 23
1180: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20  , 5, JT_INNER   
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
11a0: 2c 0a 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20  ,.    /* cross  
11b0: 20 2a 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f   */ { 28, 5, JT_
11c0: 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20  INNER|JT_CROSS  
11d0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20         },.  };. 
11e0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41   int i, j;.  apA
11f0: 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70  ll[0] = pA;.  ap
1200: 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61  All[1] = pB;.  a
1210: 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20  pAll[2] = pC;.  
1220: 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20  for(i=0; i<3 && 
1230: 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  apAll[i]; i++){.
1240: 20 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d      p = apAll[i]
1250: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1260: 3c 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77  <ArraySize(aKeyw
1270: 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ord); j++){.    
1280: 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79    if( p->n==aKey
1290: 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20  word[j].nChar . 
12a0: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
12b0: 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61  te3StrNICmp((cha
12c0: 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65  r*)p->z, &zKeyTe
12d0: 78 74 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69  xt[aKeyword[j].i
12e0: 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20  ], p->n)==0 ){. 
12f0: 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20         jointype 
1300: 7c 3d 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63  |= aKeyword[j].c
1310: 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ode;.        bre
1320: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1330: 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
1340: 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20  j==0 || j==1 || 
1350: 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20  j==2 || j==3 || 
1360: 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20  j==4 || j==5 || 
1370: 6a 3d 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20  j==6 );.    if( 
1380: 6a 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65  j>=ArraySize(aKe
1390: 79 77 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20  yword) ){.      
13a0: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45  jointype |= JT_E
13b0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
13c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
13d0: 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  f(.     (jointyp
13e0: 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  e & (JT_INNER|JT
13f0: 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e  _OUTER))==(JT_IN
1400: 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c  NER|JT_OUTER) ||
1410: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
1420: 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20  & JT_ERROR)!=0. 
1430: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1440: 61 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20  ar *zSp = " ";. 
1450: 20 20 20 61 73 73 65 72 74 28 20 70 42 21 3d 30     assert( pB!=0
1460: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d   );.    if( pC==
1470: 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20  0 ){ zSp++; }.  
1480: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1490: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
14a0: 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65  wn or unsupporte
14b0: 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20  d join type: ". 
14c0: 20 20 20 20 20 20 22 25 54 20 25 54 25 73 25 54        "%T %T%s%T
14d0: 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20  ", pA, pB, zSp, 
14e0: 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  pC);.    jointyp
14f0: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
1500: 7d 65 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74  }else if( (joint
1510: 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
1520: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
1530: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
1540: 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21  LEFT|JT_RIGHT))!
1550: 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20  =JT_LEFT ){.    
1560: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1570: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
1580: 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f  RIGHT and FULL O
1590: 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e  UTER JOINs are n
15a0: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70  ot currently sup
15b0: 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f  ported");.    jo
15c0: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
15d0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
15e0: 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  jointype;.}../*.
15f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
1600: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
1610: 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74  in a table.  Ret
1620: 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f  urn -1 if the co
1630: 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  lumn.** is not c
1640: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
1650: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
1660: 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   int columnIndex
1670: 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f  (Table *pTab, co
1680: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b  nst char *zCol){
1690: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
16a0: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
16b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
16c0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
16d0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
16e0: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20  ame, zCol)==0 ) 
16f0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1700: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
1710: 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66  .** Search the f
1720: 69 72 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e  irst N tables in
1730: 20 70 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74   pSrc, from left
1740: 20 74 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69   to right, looki
1750: 6e 67 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c  ng for a.** tabl
1760: 65 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  e that has a col
1770: 75 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20  umn named zCol. 
1780: 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75   .**.** When fou
1790: 6e 64 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61  nd, set *piTab a
17a0: 6e 64 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65  nd *piCol to the
17b0: 20 74 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64   table index and
17c0: 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a   column index.**
17d0: 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67   of the matching
17e0: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75   column and retu
17f0: 72 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49  rn TRUE..**.** I
1800: 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74  f not found, ret
1810: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74  urn FALSE..*/.st
1820: 61 74 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e  atic int tableAn
1830: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20  dColumnIndex(.  
1840: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
1850: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1860: 20 74 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63   tables to searc
1870: 68 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  h */.  int N,   
1880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1890: 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
18a0: 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20  in pSrc->a[] to 
18b0: 73 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73  search */.  cons
18c0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20  t char *zCol,   
18d0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
18e0: 63 6f 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f  column we are lo
18f0: 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69  oking for */.  i
1900: 6e 74 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20  nt *piTab,      
1910: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64      /* Write ind
1920: 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20  ex of pSrc->a[] 
1930: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  here */.  int *p
1940: 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f  iCol           /
1950: 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66  * Write index of
1960: 20 70 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d   pSrc->a[*piTab]
1970: 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65  .pTab->aCol[] he
1980: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
1990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19a0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
19b0: 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53  ver tables in pS
19c0: 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rc */.  int iCol
19d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19e0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
19f0: 6d 61 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f  matching zCol */
1a00: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 69 54  ..  assert( (piT
1a10: 61 62 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d  ab==0)==(piCol==
1a20: 30 29 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f  0) );  /* Both o
1a30: 72 20 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55  r neither are NU
1a40: 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  LL */.  for(i=0;
1a50: 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<N; i++){.    
1a60: 69 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  iCol = columnInd
1a70: 65 78 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54  ex(pSrc->a[i].pT
1a80: 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69  ab, zCol);.    i
1a90: 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
1aa0: 20 20 20 20 69 66 28 20 70 69 54 61 62 20 29 7b      if( piTab ){
1ab0: 0a 20 20 20 20 20 20 20 20 2a 70 69 54 61 62 20  .        *piTab 
1ac0: 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69  = i;.        *pi
1ad0: 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Col = iCol;.    
1ae0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1af0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
1b00: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1b10: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b20: 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
1b30: 74 65 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79  terms implied by
1b40: 20 4a 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20   JOIN syntax to 
1b50: 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
1b60: 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  use expression o
1b70: 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
1b80: 6d 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65  ment. The new te
1b90: 72 6d 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  rm, which.** is 
1ba0: 41 4e 44 65 64 20 77 69 74 68 20 74 68 65 20 65  ANDed with the e
1bb0: 78 69 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c  xisting WHERE cl
1bc0: 61 75 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20  ause, is of the 
1bd0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  form:.**.**    (
1be0: 74 61 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32  tab1.col1 = tab2
1bf0: 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65  .col2).**.** whe
1c00: 72 65 20 74 61 62 31 20 69 73 20 74 68 65 20 69  re tab1 is the i
1c10: 53 72 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20  Src'th table in 
1c20: 53 72 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64  SrcList pSrc and
1c30: 20 74 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a   tab2 is the .**
1c40: 20 28 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f   (iSrc+1)'th. Co
1c50: 6c 75 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c  lumn col1 is col
1c60: 75 6d 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20  umn iColLeft of 
1c70: 74 61 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69  tab1, and col2 i
1c80: 73 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  s.** column iCol
1c90: 52 69 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a  Right of tab2..*
1ca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64  /.static void ad
1cb0: 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61  dWhereTerm(.  Pa
1cc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ce0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1cf0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1d00: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
1d10: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1d20: 20 74 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20   tables in FROM 
1d30: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
1d40: 69 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  iLeft,          
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1d60: 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 74 61  ndex of first ta
1d70: 62 6c 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70  ble to join in p
1d80: 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Src */.  int iCo
1d90: 6c 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  lLeft,          
1da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1db0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66  x of column in f
1dc0: 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  irst table */.  
1dd0: 69 6e 74 20 69 52 69 67 68 74 2c 20 20 20 20 20  int iRight,     
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f  /* Index of seco
1e00: 6e 64 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63  nd table in pSrc
1e10: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69   */.  int iColRi
1e20: 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
1e30: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1e40: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f  f column in seco
1e50: 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nd table */.  in
1e60: 74 20 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20  t isOuterJoin,  
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e80: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
1e90: 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a   an OUTER join *
1ea0: 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65  /.  Expr **ppWhe
1eb0: 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  re              
1ec0: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54      /* IN/OUT: T
1ed0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1ee0: 74 6f 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a  to add to */.){.
1ef0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1f00: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
1f10: 70 72 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20  pr *pE1;.  Expr 
1f20: 2a 70 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE2;.  Expr *pE
1f30: 71 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  q;..  assert( iL
1f40: 65 66 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20  eft<iRight );.  
1f50: 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53  assert( pSrc->nS
1f60: 72 63 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61  rc>iRight );.  a
1f70: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69  ssert( pSrc->a[i
1f80: 4c 65 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20  Left].pTab );.  
1f90: 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
1fa0: 69 52 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a  iRight].pTab );.
1fb0: 0a 20 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33  .  pE1 = sqlite3
1fc0: 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72  CreateColumnExpr
1fd0: 28 64 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74  (db, pSrc, iLeft
1fe0: 2c 20 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70  , iColLeft);.  p
1ff0: 45 32 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  E2 = sqlite3Crea
2000: 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c  teColumnExpr(db,
2010: 20 70 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69   pSrc, iRight, i
2020: 43 6f 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45  ColRight);..  pE
2030: 71 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  q = sqlite3PExpr
2040: 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20  (pParse, TK_EQ, 
2050: 70 45 31 2c 20 70 45 32 2c 20 30 29 3b 0a 20 20  pE1, pE2, 0);.  
2060: 69 66 28 20 70 45 71 20 26 26 20 69 73 4f 75 74  if( pEq && isOut
2070: 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78  erJoin ){.    Ex
2080: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
2090: 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  q, EP_FromJoin);
20a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
20b0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
20c0: 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  (pEq, EP_TokenOn
20d0: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
20e0: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 49 72 72  ;.    ExprSetIrr
20f0: 65 64 75 63 69 62 6c 65 28 70 45 71 29 3b 0a 20  educible(pEq);. 
2100: 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f     pEq->iRightJo
2110: 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70  inTable = (i16)p
2120: 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a  E2->iTable;.  }.
2130: 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c    *ppWhere = sql
2140: 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
2150: 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a  *ppWhere, pEq);.
2160: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
2170: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
2180: 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72  perty on all ter
2190: 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ms of the given 
21a0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41  expression..** A
21b0: 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e  nd set the Expr.
21c0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
21d0: 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76  to iTable for ev
21e0: 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a  ery term in the.
21f0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ** expression..*
2200: 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d  *.** The EP_From
2210: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73  Join property is
2220: 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f   used on terms o
2230: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
2240: 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c  to tell.** the L
2250: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70  EFT OUTER JOIN p
2260: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
2270: 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69  that this term i
2280: 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  s part of the.**
2290: 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f   join restrictio
22a0: 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  n specified in t
22b0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
22c0: 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20  lause and not a 
22d0: 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  part.** of the m
22e0: 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52  ore general WHER
22f0: 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65  E clause.  These
2300: 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64   terms are moved
2310: 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20   over to the.** 
2320: 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72  WHERE clause dur
2330: 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73  ing join process
2340: 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20  ing but we need 
2350: 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
2360: 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61   they.** origina
2370: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
2380: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
2390: 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52  *.** The Expr.iR
23a0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65  ightJoinTable te
23b0: 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c  lls the WHERE cl
23c0: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
23d0: 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72  that the.** expr
23e0: 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f  ession depends o
23f0: 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f  n table iRightJo
2400: 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20  inTable even if 
2410: 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f  that table is no
2420: 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20  t.** explicitly 
2430: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
2440: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
2450: 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  at information i
2460: 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20  s needed.** for 
2470: 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a  cases like this:
2480: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
2490: 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
24a0: 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
24b0: 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a  t2.b AND t1.x=5.
24c0: 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20  **.** The where 
24d0: 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20  clause needs to 
24e0: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
24f0: 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35  ng of the t1.x=5
2500: 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61  .** term until a
2510: 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70  fter the t2 loop
2520: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49   of the join.  I
2530: 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a  n that way, a.**
2540: 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c   NULL t2 row wil
2550: 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68  l be inserted wh
2560: 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20  enever t1.x!=5. 
2570: 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a   If we do not.**
2580: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
2590: 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69  ing of t1.x=5, i
25a0: 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73  t will be proces
25b0: 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  sed immediately.
25c0: 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20  ** after the t1 
25d0: 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69  loop and rows wi
25e0: 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20  th t1.x!=5 will 
25f0: 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a  never appear in.
2600: 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77  ** the output, w
2610: 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63  hich is incorrec
2620: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2630: 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  d setJoinExpr(Ex
2640: 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  pr *p, int iTabl
2650: 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e){.  while( p )
2660: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
2670: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
2680: 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72  Join);.    asser
2690: 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
26a0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
26b0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
26c0: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
26d0: 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 29 3b  tIrreducible(p);
26e0: 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f  .    p->iRightJo
26f0: 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69  inTable = (i16)i
2700: 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f  Table;.    setJo
2710: 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  inExpr(p->pLeft,
2720: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20   iTable);.    p 
2730: 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  = p->pRight;.  }
2740: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
2750: 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65  routine processe
2760: 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72  s the join infor
2770: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  mation for a SEL
2780: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
2790: 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  * ON and USING c
27a0: 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65  lauses are conve
27b0: 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20  rted into extra 
27c0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
27d0: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41  RE clause..** NA
27e0: 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f  TURAL joins also
27f0: 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48   create extra WH
2800: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
2810: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
2820: 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  s of a FROM clau
2830: 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  se are contained
2840: 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70   in the Select.p
2850: 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Src structure..*
2860: 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20  * The left most 
2870: 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72  table is the fir
2880: 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65  st entry in Sele
2890: 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69  ct.pSrc.  The ri
28a0: 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c  ght-most.** tabl
28b0: 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  e is the last en
28c0: 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f  try.  The join o
28d0: 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20  perator is held 
28e0: 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a  in the entry to.
28f0: 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  ** the left.  Th
2900: 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61  us entry 0 conta
2910: 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  ins the join ope
2920: 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  rator for the jo
2930: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e  in between.** en
2940: 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20  tries 0 and 1.  
2950: 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  Any ON or USING 
2960: 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74  clauses associat
2970: 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e  ed with the join
2980: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74   are.** also att
2990: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
29a0: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
29b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
29c0: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
29d0: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
29e0: 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
29f0: 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73  int sqliteProces
2a00: 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61  sJoin(Parse *pPa
2a10: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
2a20: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2a30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a40: 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73     /* All tables
2a50: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2a60: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  use */.  int i, 
2a70: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
2a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2a90: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73   counters */.  s
2aa0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2ab0: 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f  em *pLeft;     /
2ac0: 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69  * Left table bei
2ad0: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73  ng joined */.  s
2ae0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2af0: 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f  em *pRight;    /
2b00: 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65  * Right table be
2b10: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20  ing joined */.. 
2b20: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
2b30: 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63  .  pLeft = &pSrc
2b40: 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74  ->a[0];.  pRight
2b50: 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20   = &pLeft[1];.  
2b60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
2b70: 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52  >nSrc-1; i++, pR
2b80: 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29  ight++, pLeft++)
2b90: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65  {.    Table *pLe
2ba0: 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70  ftTab = pLeft->p
2bb0: 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Tab;.    Table *
2bc0: 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67  pRightTab = pRig
2bd0: 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e  ht->pTab;.    in
2be0: 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20  t isOuter;..    
2bf0: 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54  if( NEVER(pLeftT
2c00: 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54  ab==0 || pRightT
2c10: 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  ab==0) ) continu
2c20: 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d  e;.    isOuter =
2c30: 20 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79   (pRight->jointy
2c40: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
2c50: 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  0;..    /* When 
2c60: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
2c70: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ord is present, 
2c80: 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  add WHERE clause
2c90: 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a   terms for.    *
2ca0: 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74  * every column t
2cb0: 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c  hat the two tabl
2cc0: 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f  es have in commo
2cd0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
2ce0: 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79  ( pRight->jointy
2cf0: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
2d00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  ){.      if( pRi
2d10: 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67  ght->pOn || pRig
2d20: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
2d30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2d40: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
2d50: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61   NATURAL join ma
2d60: 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20  y not have ".   
2d70: 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f          "an ON o
2d80: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c  r USING clause",
2d90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
2da0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
2db0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2dc0: 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b  pRightTab->nCol;
2dd0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
2de0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a  har *zName;   /*
2df0: 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20   Name of column 
2e00: 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62  in the right tab
2e10: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
2e20: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20  t iLeft;     /* 
2e30: 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61  Matching left ta
2e40: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
2e50: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a  nt iLeftCol;  /*
2e60: 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   Matching column
2e70: 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62   in the left tab
2e80: 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a  le */..        z
2e90: 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62  Name = pRightTab
2ea0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
2eb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62  .        if( tab
2ec0: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
2ed0: 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d  (pSrc, i+1, zNam
2ee0: 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66  e, &iLeft, &iLef
2ef0: 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  tCol) ){.       
2f00: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
2f10: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c  pParse, pSrc, iL
2f20: 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69  eft, iLeftCol, i
2f30: 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20  +1, j,.         
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2f50: 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72  Outer, &p->pWher
2f60: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2f70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2f80: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
2f90: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
2fa0: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
2fb0: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
2fc0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2fd0: 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55  On && pRight->pU
2fe0: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  sing ){.      sq
2ff0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3000: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61  arse, "cannot ha
3010: 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ve both ON and U
3020: 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22  SING ".        "
3030: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
3040: 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20  ame join");.    
3050: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3060: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
3070: 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74  e ON clause to t
3080: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
3090: 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e  ERE clause, conn
30a0: 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  ected by.    ** 
30b0: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
30c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
30d0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20  pRight->pOn ){. 
30e0: 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72       if( isOuter
30f0: 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70   ) setJoinExpr(p
3100: 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67  Right->pOn, pRig
3110: 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ht->iCursor);.  
3120: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
3130: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
3140: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57  Parse->db, p->pW
3150: 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f  here, pRight->pO
3160: 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  n);.      pRight
3170: 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->pOn = 0;.    }
3180: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
3190: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74  extra terms on t
31a0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
31b0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
31c0: 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  named.    ** in 
31d0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
31e0: 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  .  Example: If t
31f0: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f  he two tables to
3200: 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a   be joined are .
3210: 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61      ** A and B a
3220: 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  nd the USING cla
3230: 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20  use names X, Y, 
3240: 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20  and Z, then add 
3250: 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  this.    ** to t
3260: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a  he WHERE clause:
3270: 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20      A.X=B.X AND 
3280: 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d  A.Y=B.Y AND A.Z=
3290: 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72  B.Z.    ** Repor
32a0: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  t an error if an
32b0: 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e  y column mention
32c0: 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ed in the USING 
32d0: 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a  clause is.    **
32e0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
32f0: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f  n both tables to
3300: 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20   be joined..    
3310: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
3320: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
3330: 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74     IdList *pList
3340: 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e   = pRight->pUsin
3350: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
3360: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
3370: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
3380: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f  ar *zName;     /
3390: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65  * Name of the te
33a0: 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  rm in the USING 
33b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
33c0: 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20    int iLeft;    
33d0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74     /* Table on t
33e0: 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74  he left with mat
33f0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ching column nam
3400: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
3410: 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a   iLeftCol;    /*
3420: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
3430: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
3440: 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f  n on the left */
3450: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69  .        int iRi
3460: 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c  ghtCol;   /* Col
3470: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
3480: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
3490: 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20   the right */.. 
34a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
34b0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
34c0: 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74  ;.        iRight
34d0: 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65  Col = columnInde
34e0: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
34f0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
3500: 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20   iRightCol<0.   
3510: 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41        || !tableA
3520: 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  ndColumnIndex(pS
3530: 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20  rc, i+1, zName, 
3540: 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f  &iLeft, &iLeftCo
3550: 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  l).        ){.  
3560: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3570: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3580: 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69  "cannot join usi
3590: 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63  ng column %s - c
35a0: 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20  olumn ".        
35b0: 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74      "not present
35c0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22   in both tables"
35d0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
35e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
35f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3600: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61  addWhereTerm(pPa
3610: 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74  rse, pSrc, iLeft
3620: 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c  , iLeftCol, i+1,
3630: 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20   iRightCol,.    
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3650: 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57   isOuter, &p->pW
3660: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  here);.      }. 
3670: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3680: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
3690: 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22  sert code into "
36a0: 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  v" that will pus
36b0: 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20  h the record on 
36c0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a  the top of the.*
36d0: 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65  * stack into the
36e0: 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   sorter..*/.stat
36f0: 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f  ic void pushOnto
3700: 53 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20  Sorter(.  Parse 
3710: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
3720: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
3730: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
3740: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f   *pOrderBy,    /
3750: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
3760: 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63  lause */.  Selec
3770: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
3780: 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53    /* The whole S
3790: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
37a0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61  */.  int regData
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
37c0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
37d0: 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65  data to be sorte
37e0: 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  d */.){.  Vdbe *
37f0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
3800: 65 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  e;.  int nExpr =
3810: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
3820: 3b 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 20  ;.  int regBase 
3830: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
3840: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45  Range(pParse, nE
3850: 78 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65  xpr+2);.  int re
3860: 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
3870: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
3880: 73 65 29 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20  se);.  int op;. 
3890: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
38a0: 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
38b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
38c0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
38d0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  , pOrderBy, regB
38e0: 61 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ase, 0);.  sqlit
38f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3900: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72  OP_Sequence, pOr
3910: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
3920: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
3930: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
3940: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
3950: 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b  egData, regBase+
3960: 6e 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73  nExpr+1, 1);.  s
3970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
3980: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3990: 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  d, regBase, nExp
39a0: 72 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64  r + 2, regRecord
39b0: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  );.  if( pSelect
39c0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
39d0: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
39e0: 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49   op = OP_SorterI
39f0: 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nsert;.  }else{.
3a00: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49      op = OP_IdxI
3a10: 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  nsert;.  }.  sql
3a20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3a30: 2c 20 6f 70 2c 20 70 4f 72 64 65 72 42 79 2d 3e  , op, pOrderBy->
3a40: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
3a50: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ord);.  sqlite3R
3a60: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
3a70: 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
3a80: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
3a90: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
3aa0: 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78  se, regBase, nEx
3ab0: 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65  pr+2);.  if( pSe
3ac0: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  lect->iLimit ){.
3ad0: 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61      int addr1, a
3ae0: 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c  ddr2;.    int iL
3af0: 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53  imit;.    if( pS
3b00: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29  elect->iOffset )
3b10: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
3b20: 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65   pSelect->iOffse
3b30: 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  t+1;.    }else{.
3b40: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70        iLimit = p
3b50: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a  Select->iLimit;.
3b60: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20      }.    addr1 
3b70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3b80: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op1(v, OP_IfZero
3b90: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  , iLimit);.    s
3ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3bb0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69  (v, OP_AddImm, i
3bc0: 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
3bd0: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
3be0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
3bf0: 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74  Goto);.    sqlit
3c00: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
3c10: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71  , addr1);.    sq
3c20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
3c30: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64  v, OP_Last, pOrd
3c40: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b  erBy->iECursor);
3c50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3c60: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
3c70: 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  ete, pOrderBy->i
3c80: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
3c90: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
3ca0: 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d  e(v, addr2);.  }
3cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f  .}../*.** Add co
3cc0: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
3cd0: 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74  the OFFSET.*/.st
3ce0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66  atic void codeOf
3cf0: 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c  fset(.  Vdbe *v,
3d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
3d10: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
3d20: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c  this VM */.  Sel
3d30: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f  ect *p,        /
3d40: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
3d50: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
3d60: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ed */.  int iCon
3d70: 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d  tinue     /* Jum
3d80: 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
3d90: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
3da0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  d */.){.  if( p-
3db0: 3e 69 4f 66 66 73 65 74 20 26 26 20 69 43 6f 6e  >iOffset && iCon
3dc0: 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20  tinue!=0 ){.    
3dd0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71  int addr;.    sq
3de0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3df0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d  v, OP_AddImm, p-
3e00: 3e 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20  >iOffset, -1);. 
3e10: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
3e20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3e30: 50 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66  P_IfNeg, p->iOff
3e40: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
3e50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3e60: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74  P_Goto, 0, iCont
3e70: 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43  inue);.    VdbeC
3e80: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70  omment((v, "skip
3e90: 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22   OFFSET records"
3ea0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
3eb0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
3ec0: 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ddr);.  }.}../*.
3ed0: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
3ee0: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
3ef0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
3f00: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
3f10: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
3f20: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
3f30: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
3f40: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
3f50: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
3f60: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
3f70: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
3f80: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
3f90: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
3fa0: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
3fb0: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
3fc0: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
3fd0: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
3fe0: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
3ff0: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
4000: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
4010: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
4020: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
4030: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
4040: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
4050: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
4060: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4070: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
4080: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
4090: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
40a0: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
40b0: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
40c0: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
40d0: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
40e0: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
40f0: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
4100: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
4110: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
4120: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
4130: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4140: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
4150: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
4160: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
4170: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
4180: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
4190: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
41a0: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
41b0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
41c0: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
41d0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
41e0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
41f0: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69  b, addrRepeat, i
4200: 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74  Mem, N);.  sqlit
4210: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
4220: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69  OP_MakeRecord, i
4230: 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73  Mem, N, r1);.  s
4240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4250: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
4260: 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73  , iTab, r1);.  s
4270: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4280: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
4290: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
42a0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
42b0: 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
42c0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
42d0: 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20  e when a SELECT 
42e0: 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  is used within a
42f0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
4300: 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20  * (example:  "a 
4310: 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
4320: 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69  M table)") but i
4330: 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  t has more than 
4340: 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75  1 result.** colu
4350: 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20  mn.  We do this 
4360: 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  in a subroutine 
4370: 62 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f  because the erro
4380: 72 20 75 73 65 64 20 74 6f 20 6f 63 63 75 72 0a  r used to occur.
4390: 2a 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  ** in multiple p
43a0: 6c 61 63 65 73 2e 20 20 28 54 68 65 20 65 72 72  laces.  (The err
43b0: 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69  or only occurs i
43c0: 6e 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c  n one place now,
43d0: 20 62 75 74 20 77 65 0a 2a 2a 20 72 65 74 61 69   but we.** retai
43e0: 6e 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  n the subroutine
43f0: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64   to minimize cod
4400: 65 20 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a  e disruption.).*
4410: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
4420: 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e  ckForMultiColumn
4430: 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50  SelectError(.  P
4440: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4450: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
4460: 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  text. */.  Selec
4470: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
4480: 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f  /* Destination o
4490: 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73  f SELECT results
44a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20   */.  int nExpr 
44b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
44c0: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
44d0: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
44e0: 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a  by SELECT */.){.
44f0: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
4500: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66  est->eDest;.  if
4510: 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44  ( nExpr>1 && (eD
4520: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20  est==SRT_Mem || 
4530: 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20  eDest==SRT_Set) 
4540: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4550: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4560: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65  only a single re
4570: 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72  sult allowed for
4580: 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c   ".       "a SEL
4590: 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74  ECT that is part
45a0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
45b0: 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n");.    return 
45c0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
45d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
45e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e  #endif../*.** An
45f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4600: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63   following objec
4610: 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 63  t is used to rec
4620: 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ord information 
4630: 61 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20  about.** how to 
4640: 70 72 6f 63 65 73 73 20 74 68 65 20 44 49 53 54  process the DIST
4650: 49 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f  INCT keyword, to
4660: 20 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e   simplify passin
4670: 67 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69  g that informati
4680: 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73  on.** into the s
4690: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29  electInnerLoop()
46a0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70   routine..*/.typ
46b0: 65 64 65 66 20 73 74 72 75 63 74 20 44 69 73 74  edef struct Dist
46c0: 69 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63 74  inctCtx Distinct
46d0: 43 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74  Ctx;.struct Dist
46e0: 69 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69  inctCtx {.  u8 i
46f0: 73 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54  sTnct;      /* T
4700: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
4710: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
4720: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65  resent */.  u8 e
4730: 54 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f  TnctType;   /* O
4740: 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f  ne of the WHERE_
4750: 44 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61  DISTINCT_* opera
4760: 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61  tors */.  int ta
4770: 62 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68  bTnct;    /* Eph
4780: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65  emeral table use
4790: 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  d for DISTINCT p
47a0: 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69  rocessing */.  i
47b0: 6e 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f  nt addrTnct;   /
47c0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
47d0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70  OpenEphemeral op
47e0: 63 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74  code for tabTnct
47f0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
4800: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
4810: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
4820: 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20  r the inside of 
4830: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
4840: 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a  * of a SELECT..*
4850: 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61  *.** If srcTab a
4860: 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62  nd nColumn are b
4870: 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  oth zero, then t
4880: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
4890: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
48a0: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
48b0: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
48c0: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
48d0: 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74  f nColumn>0.** t
48e0: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
48f0: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
4900: 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65  nd pEList is use
4910: 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68  d only to get th
4920: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66  e.** datatypes f
4930: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
4940: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
4950: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
4960: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4980: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
4990: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49b0: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
49c0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
49d0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45  ing coded */.  E
49e0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
49f0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
4a00: 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65  f values being e
4a10: 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e  xtracted */.  in
4a20: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
4a30: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
4a40: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
4a50: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  le */.  int nCol
4a60: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
4a70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
4a80: 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72  umns in the sour
4a90: 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ce table */.  Ex
4aa0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
4ab0: 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20  ,     /* If not 
4ac0: 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c  NULL, sort resul
4ad0: 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65  ts using this ke
4ae0: 79 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  y */.  DistinctC
4af0: 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f  tx *pDistinct, /
4b00: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  * If not NULL, i
4b10: 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72  nfo on how to pr
4b20: 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a  ocess DISTINCT *
4b30: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
4b40: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48  pDest,      /* H
4b50: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
4b60: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
4b70: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
4b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4b90: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
4ba0: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
4bb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4bd0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
4be0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
4bf0: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a  nner loop */.){.
4c00: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
4c10: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
4c20: 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   i;.  int hasDis
4c30: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
4c40: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
4c50: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
4c60: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
4c70: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
4c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
4c90: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
4ca0: 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20  ding result set 
4cb0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
4cc0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
4cd0: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
4ce0: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
4cf0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
4d00: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
4d10: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
4d20: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
4d30: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
4d40: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
4d50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4d60: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
4d70: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76   */..  assert( v
4d80: 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
4d90: 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  v==0) ) return;.
4da0: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
4db0: 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74  !=0 );.  hasDist
4dc0: 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74  inct = pDistinct
4dd0: 20 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54   ? pDistinct->eT
4de0: 6e 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f  nctType : WHERE_
4df0: 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20  DISTINCT_NOOP;. 
4e00: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
4e10: 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74   && !hasDistinct
4e20: 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73   ){.    codeOffs
4e30: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
4e40: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ue);.  }..  /* P
4e50: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
4e60: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
4e70: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
4e80: 29 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f  ){.    nResultCo
4e90: 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d  l = nColumn;.  }
4ea0: 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c  else{.    nResul
4eb0: 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  tCol = pEList->n
4ec0: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Expr;.  }.  if( 
4ed0: 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
4ee0: 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53  ){.    pDest->iS
4ef0: 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  dst = pParse->nM
4f00: 65 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73 74 2d  em+1;.    pDest-
4f10: 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74  >nSdst = nResult
4f20: 43 6f 6c 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Col;.    pParse-
4f30: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
4f40: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  Col;.  }else{ . 
4f50: 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74     assert( pDest
4f60: 2d 3e 6e 53 64 73 74 3d 3d 6e 52 65 73 75 6c 74  ->nSdst==nResult
4f70: 43 6f 6c 20 29 3b 0a 20 20 7d 0a 20 20 72 65 67  Col );.  }.  reg
4f80: 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e  Result = pDest->
4f90: 69 53 64 73 74 3b 0a 20 20 69 66 28 20 6e 43 6f  iSdst;.  if( nCo
4fa0: 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f  lumn>0 ){.    fo
4fb0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
4fc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
4fd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4fe0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
4ff0: 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75  cTab, i, regResu
5000: 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lt+i);.    }.  }
5010: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d  else if( eDest!=
5020: 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20  SRT_Exists ){.  
5030: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
5040: 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58  ination is an EX
5050: 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73  ISTS(...) expres
5060: 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c  sion, the actual
5070: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72  .    ** values r
5080: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
5090: 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65  ELECT are not re
50a0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
50b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
50c0: 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
50d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
50e0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
50f0: 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65  arse, pEList, re
5100: 67 52 65 73 75 6c 74 2c 20 65 44 65 73 74 3d 3d  gResult, eDest==
5110: 53 52 54 5f 4f 75 74 70 75 74 29 3b 0a 20 20 7d  SRT_Output);.  }
5120: 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65  .  nColumn = nRe
5130: 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49  sultCol;..  /* I
5140: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
5150: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
5160: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
5170: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
5180: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
5190: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
51a0: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
51b0: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
51c0: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
51d0: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
51e0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
51f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
5200: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
5210: 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ert( pEList->nEx
5220: 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  pr==nColumn );. 
5230: 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74     switch( pDist
5240: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20  inct->eTnctType 
5250: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  ){.      case WH
5260: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
5270: 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
5280: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20  VdbeOp *pOp;    
5290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f          /* No lo
52a0: 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70  nger required Op
52b0: 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
52c0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  r. */.        in
52d0: 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20  t iJump;        
52e0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65        /* Jump de
52f0: 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  stination */.   
5300: 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76       int regPrev
5310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
5320: 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e  Previous row con
5330: 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  tent */..       
5340: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
5350: 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ce for the previ
5360: 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ous row */.     
5370: 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61     regPrev = pPa
5380: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
5390: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
53a0: 6d 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20  m += nColumn;.. 
53b0: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
53c0: 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
53d0: 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c  meral coded earl
53e0: 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c  ier to an OP_Nul
53f0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  l.        ** set
5400: 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65  s the MEM_Cleare
5410: 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72  d bit on the fir
5420: 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74  st register of t
5430: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
5440: 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54  evious value.  T
5450: 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
5460: 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74  he OP_Ne below t
5470: 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20  o always.       
5480: 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20   ** fail on the 
5490: 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
54a0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e  of the loop even
54b0: 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
54c0: 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20        ** row is 
54d0: 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20  all NULLs..     
54e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
54f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
5500: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
5510: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
5520: 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c         pOp = sql
5530: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
5540: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
5550: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Tnct);.        p
5560: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
5570: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f  Null;.        pO
5580: 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20  p->p1 = 1;.     
5590: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67     pOp->p2 = reg
55a0: 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69  Prev;..        i
55b0: 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Jump = sqlite3Vd
55c0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
55d0: 20 2b 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   + nColumn;.    
55e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
55f0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
5600: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
5610: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
5620: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
5630: 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  se, pEList->a[i]
5640: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
5650: 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 75 6d 6e     if( i<nColumn
5660: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
5670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5680: 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65  Op3(v, OP_Ne, re
5690: 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70  gResult+i, iJump
56a0: 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20  , regPrev+i);.  
56b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
56c0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
56d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
56e0: 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75 6c 74  OP_Eq, regResult
56f0: 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72  +i, iContinue, r
5700: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
5710: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5720: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5730: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
5740: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
5750: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
5760: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5770: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
5780: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
5790: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
57a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
57b0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
57c0: 76 29 3d 3d 69 4a 75 6d 70 20 29 3b 0a 20 20 20  v)==iJump );.   
57d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
57e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
57f0: 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  y, regResult, re
5800: 67 50 72 65 76 2c 20 6e 43 6f 6c 75 6d 6e 2d 31  gPrev, nColumn-1
5810: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5820: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
5830: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
5840: 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20  INCT_UNIQUE: {. 
5850: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5860: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
5870: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
5880: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
5890: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
58a0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
58b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
58c0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
58d0: 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53  tType==WHERE_DIS
58e0: 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20  TINCT_UNORDERED 
58f0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44  );.        codeD
5900: 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
5910: 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e  pDistinct->tabTn
5920: 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e  ct, iContinue, n
5930: 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 73 75 6c  Column, regResul
5940: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
5950: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
5960: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
5970: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  y==0 ){.      co
5980: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69  deOffset(v, p, i
5990: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d  Continue);.    }
59a0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
59b0: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
59c0: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
59d0: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
59e0: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
59f0: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
5a00: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
5a10: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
5a20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5a30: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
5a40: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
5a50: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ion: {.      int
5a60: 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20   r1;.      r1 = 
5a70: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
5a80: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
5a90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5aa0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
5ab0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
5ac0: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
5ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5ae0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
5af0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
5b00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5b10: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5b20: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5b30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5b40: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
5b50: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
5b60: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
5b70: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
5b80: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
5b90: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
5ba0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
5bb0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
5bc0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
5bd0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
5be0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
5bf0: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
5c00: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
5c10: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5c20: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
5c30: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  m, regResult, nC
5c40: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
5c50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5c60: 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  f..    /* Store 
5c70: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
5c80: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
5c90: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
5ca0: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
5cb0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
5cc0: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
5cd0: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
5ce0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
5cf0: 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  se);.      testc
5d00: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
5d10: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
5d20: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
5d30: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
5d40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5d50: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
5d60: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
5d70: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31  ult, nColumn, r1
5d80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
5d90: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
5da0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5db0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
5dc0: 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  , p, r1);.      
5dd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
5de0: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
5df0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
5e00: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5e10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5e20: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
5e30: 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  rm, r2);.       
5e40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5e50: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
5e60: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b   iParm, r1, r2);
5e70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5e80: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
5e90: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
5ea0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
5eb0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
5ec0: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
5ed0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5ee0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5ef0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5f00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5f10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5f20: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
5f30: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
5f40: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
5f50: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
5f60: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
5f70: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
5f80: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
5f90: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
5fa0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
5fb0: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
5fc0: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
5fd0: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
5fe0: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
5ff0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
6000: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
6010: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
6020: 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66  .      pDest->af
6030: 66 53 64 73 74 20 3d 0a 20 20 20 20 20 20 20 20  fSdst =.        
6040: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6050: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
6060: 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  (pEList->a[0].pE
6070: 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53  xpr, pDest->affS
6080: 64 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  dst);.      if( 
6090: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
60a0: 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20      /* At first 
60b0: 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64  glance you would
60c0: 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20   think we could 
60d0: 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65  optimize out the
60e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  .        ** ORDE
60f0: 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73  R BY in this cas
6100: 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65  e since the orde
6110: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
6120: 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20  the set.        
6130: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  ** does not matt
6140: 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d  er.  But there m
6150: 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20  ight be a LIMIT 
6160: 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68  clause, in which
6170: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65  .        ** case
6180: 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20   the order does 
6190: 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  matter */.      
61a0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
61b0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
61c0: 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29  y, p, regResult)
61d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
61e0: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
61f0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6200: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
6210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6220: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
6230: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
6240: 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61  ,1,r1, &pDest->a
6250: 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20  ffSdst, 1);.    
6260: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
6270: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
6280: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
6290: 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  sult, 1);.      
62a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
62b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
62c0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
62d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
62e0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
62f0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
6300: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
6320: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
6330: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
6340: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
6350: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
6360: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
6370: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
6380: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6390: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
63a0: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
63b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
63c0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
63d0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
63e0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
63f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
6400: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
6410: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
6420: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
6430: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
6440: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
6450: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
6460: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
6470: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
6480: 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
6490: 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
64a0: 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
64b0: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
64c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
64d0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
64e0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
64f0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
6500: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
6510: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67  pOrderBy, p, reg
6520: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
6530: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
6540: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
6550: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
6560: 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ult, iParm, 1);.
6570: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
6580: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
6590: 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
65a0: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
65b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
65c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
65d0: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
65e0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
65f0: 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e  Y */..    /* Sen
6600: 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  d the data to th
6610: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
6620: 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72  ion or to a subr
6630: 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a  outine.  In the.
6640: 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61      ** case of a
6650: 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65   subroutine, the
6660: 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65   subroutine itse
6670: 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  lf is responsibl
6680: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70  e for.    ** pop
6690: 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66 72  ping the data fr
66a0: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  om the stack..  
66b0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
66c0: 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20 20  T_Coroutine:.   
66d0: 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74   case SRT_Output
66e0: 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
66f0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
6700: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
6710: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
6720: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
6730: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
6740: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rBy ){.        i
6750: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
6760: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
6770: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6780: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6790: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
67a0: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
67b0: 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  n, r1);.        
67c0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
67d0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
67e0: 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20   p, r1);.       
67f0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
6800: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
6810: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  1);.      }else 
6820: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
6830: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
6840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6850: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
6860: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
6870: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
6880: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6890: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
68a0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
68b0: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
68c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
68d0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
68e0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
68f0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
6900: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mn);.      }.   
6910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6920: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
6930: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
6940: 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  R).    /* Discar
6950: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
6960: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
6970: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6980: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
6990: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
69a0: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
69b0: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
69c0: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
69d0: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
69e0: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
69f0: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
6a00: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
6a10: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
6a20: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
6a30: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
6a40: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
6a50: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
6a60: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
6a70: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
6a80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6a90: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
6aa0: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
6ab0: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
6ac0: 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
6ad0: 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c  eached.  Except,
6ae0: 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69   if.  ** there i
6af0: 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77  s a sorter, in w
6b00: 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f  hich case the so
6b10: 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  rter has already
6b20: 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68   limited.  ** th
6b30: 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e  e output for us.
6b40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
6b50: 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 69 4c  erBy==0 && p->iL
6b60: 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
6b70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6b80: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
6b90: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d  Limit, iBreak, -
6ba0: 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
6bb0: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
6bc0: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
6bd0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
6be0: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
6bf0: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
6c00: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
6c10: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
6c20: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
6c30: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
6c40: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
6c50: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
6c60: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
6c70: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
6c80: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
6c90: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
6ca0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
6cb0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
6cc0: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
6cd0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
6ce0: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
6cf0: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
6d00: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
6d10: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
6d20: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
6d30: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
6d40: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
6d50: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
6d60: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
6d70: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
6d80: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
6d90: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
6da0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
6db0: 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20   is obtain from 
6dc0: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
6dd0: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
6de0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
6df0: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
6e00: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
6e10: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
6e20: 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20  freed.  Add the 
6e30: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
6e40: 65 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c  e to the P4 fiel
6e50: 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75  d of an opcode u
6e60: 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e  sing.** P4_KEYIN
6e70: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68  FO_HANDOFF is th
6e80: 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64  e usual way of d
6e90: 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73  ealing with this
6ea0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
6eb0: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
6ec0: 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a  ExprList(Parse *
6ed0: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
6ee0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pList){.  sqli
6ef0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6f00: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ->db;.  int nExp
6f10: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
6f20: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
6f30: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
6f40: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  em;.  int i;..  
6f50: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
6f60: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
6f70: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
6f80: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
6f90: 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28  pInfo) + nExpr*(
6fa0: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
6fb0: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  +1) );.  if( pIn
6fc0: 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  fo ){.    pInfo-
6fd0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
6fe0: 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  8*)&pInfo->aColl
6ff0: 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e  [nExpr];.    pIn
7000: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  fo->nField = (u1
7010: 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e  6)nExpr;.    pIn
7020: 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  fo->enc = ENC(db
7030: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 64 62  );.    pInfo->db
7040: 20 3d 20 64 62 3b 0a 20 20 20 20 66 6f 72 28 69   = db;.    for(i
7050: 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
7060: 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  >a; i<nExpr; i++
7070: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
7080: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
7090: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
70a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
70b0: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
70c0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
70d0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
70e0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
70f0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
7100: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f     }.      pInfo
7110: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
7120: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
7130: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
7140: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
7150: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
7160: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
7170: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7180: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
7190: 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  ECT./*.** Name o
71a0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
71b0: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
71c0: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
71d0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
71e0: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
71f0: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
7200: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
7210: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
7220: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
7230: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
7240: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
7250: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
7260: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
7270: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
7280: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
7290: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
72a0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
72b0: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
72c0: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
72d0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
72e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
72f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7300: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7310: 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
7320: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
7330: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c  XPLAIN./*.** Unl
7340: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
7350: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
7360: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
7370: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
7380: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
7390: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
73a0: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
73b0: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
73c0: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
73d0: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
73e0: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  aption is of the
73f0: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
7400: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
7410: 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77  FOR xxx".**.** w
7420: 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20  here xxx is one 
7430: 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22  of "DISTINCT", "
7440: 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52  ORDER BY" or "GR
7450: 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79  OUP BY". Exactly
7460: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74   which.** is det
7470: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a  ermined by the z
7480: 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a  Usage argument..
7490: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
74a0: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
74b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
74c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67  onst char *zUsag
74d0: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
74e0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
74f0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
7500: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
7510: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
7520: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
7530: 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45  rse->db, "USE TE
7540: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73  MP B-TREE FOR %s
7550: 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20  ", zUsage);.    
7560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7570: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
7580: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
7590: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
75a0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
75b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
75c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f   expression b to
75d0: 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63   lvalue a. A sec
75e0: 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73  ond, no-op, vers
75f0: 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72  ion of this macr
7600: 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64  o.** is provided
7610: 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49   when SQLITE_OMI
7620: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66  T_EXPLAIN is def
7630: 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77  ined. This allow
7640: 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e  s the code.** in
7650: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
7660: 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65   to assign value
7670: 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d  s to structure m
7680: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
7690: 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69  that.** only exi
76a0: 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  st if SQLITE_OMI
76b0: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74  T_EXPLAIN is not
76c0: 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74   defined without
76d0: 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a   polluting the.*
76e0: 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e  * code with #ifn
76f0: 64 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a  def directives..
7700: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
7710: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c  ainSetInteger(a,
7720: 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65   b) a = b..#else
7730: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
7740: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
7750: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
7760: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
7770: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
7780: 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23  TempTable(y,z).#
7790: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
77a0: 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23  etInteger(y,z).#
77b0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
77c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
77d0: 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66  EXPLAIN) && !def
77e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
77f0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
7800: 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61  )./*.** Unless a
7810: 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  n "EXPLAIN QUERY
7820: 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69   PLAN" command i
7830: 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  s being processe
7840: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
7850: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
7860: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64  Otherwise, it ad
7870: 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ds a single row 
7880: 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  of output to the
7890: 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20   EQP result,.** 
78a0: 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f  where the captio
78b0: 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  n is of one of t
78c0: 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a  he two forms:.**
78d0: 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45  .**   "COMPOSITE
78e0: 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62   SUBQUERIES iSub
78f0: 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29  1 and iSub2 (op)
7900: 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54  ".**   "COMPOSIT
7910: 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75  E SUBQUERIES iSu
7920: 62 31 20 61 6e 64 20 69 53 75 62 32 20 55 53 49  b1 and iSub2 USI
7930: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28  NG TEMP B-TREE (
7940: 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  op)".**.** where
7950: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
7960: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
7970: 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
7980: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
7990: 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
79a0: 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20  ters, and op is 
79b0: 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
79c0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ntation of the p
79d0: 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
79e0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68  he same name. Th
79f0: 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22  e parameter "op"
7a00: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
7a10: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
7a20: 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52  EPT,.** TK_INTER
7a30: 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20  SECT or TK_ALL. 
7a40: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69  The first form i
7a50: 73 20 75 73 65 64 20 69 66 20 61 72 67 75 6d 65  s used if argume
7a60: 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a  nt bUseTmp is .*
7a70: 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20  * false, or the 
7a80: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69  second form if i
7a90: 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  t is true..*/.st
7aa0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
7ab0: 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61  nComposite(.  Pa
7ac0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7ae0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
7af0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b10: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
7b20: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
7b30: 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  T etc. */.  int 
7b40: 69 53 75 62 31 2c 20 20 20 20 20 20 20 20 20 20  iSub1,          
7b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7b60: 75 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a  ubquery id 1 */.
7b70: 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20    int iSub2,    
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b90: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
7ba0: 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65   2 */.  int bUse
7bb0: 54 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Tmp             
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7bd0: 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20  if a temp table 
7be0: 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20  was used */.){. 
7bf0: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
7c00: 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  UNION || op==TK_
7c10: 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
7c20: 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70  _INTERSECT || op
7c30: 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66  ==TK_ALL );.  if
7c40: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
7c50: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65  n==2 ){.    Vdbe
7c60: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
7c70: 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  dbe;.    char *z
7c80: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
7c90: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50  intf(.        pP
7ca0: 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f  arse->db, "COMPO
7cb0: 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 25  UND SUBQUERIES %
7cc0: 64 20 41 4e 44 20 25 64 20 25 73 28 25 73 29 22  d AND %d %s(%s)"
7cd0: 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a  , iSub1, iSub2,.
7ce0: 20 20 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f          bUseTmp?
7cf0: 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52  "USING TEMP B-TR
7d00: 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f  EE ":"", selectO
7d10: 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b  pName(op).    );
7d20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7d30: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
7d40: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
7d50: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
7d60: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
7d70: 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a  ;.  }.}.#else./*
7d80: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
7d90: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
7da0: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
7db0: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
7dc0: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d  efine explainCom
7dd0: 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a  posite(v,w,x,y,z
7de0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
7df0: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
7e00: 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  p was generated 
7e10: 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  using a non-null
7e20: 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65   pOrderBy argume
7e30: 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  nt,.** then the 
7e40: 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61  results were pla
7e50: 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e  ced in a sorter.
7e60: 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70    After the loop
7e70: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
7e80: 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e  * we need to run
7e90: 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20   the sorter and 
7ea0: 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c  output the resul
7eb0: 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ts.  The followi
7ec0: 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  ng.** routine ge
7ed0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
7ee0: 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68   needed to do th
7ef0: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  at..*/.static vo
7f00: 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54  id generateSortT
7f10: 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ail(.  Parse *pP
7f20: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
7f30: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
7f40: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
7f50: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
7f60: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
7f70: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
7f80: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
7f90: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42  de into this VDB
7fa0: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  E */.  int nColu
7fb0: 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  mn,      /* Numb
7fc0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
7fd0: 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
7fe0: 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20  tDest *pDest /* 
7ff0: 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64  Write the sorted
8000: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
8010: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 42 72  .){.  int addrBr
8020: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
8030: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
8040: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
8050: 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a  to exit loop */.
8060: 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e    int addrContin
8070: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
8080: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f  MakeLabel(v);  /
8090: 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20  * Jump here for 
80a0: 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
80b0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20  int addr;.  int 
80c0: 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75  iTab;.  int pseu
80d0: 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70  doTab = 0;.  Exp
80e0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
80f0: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
8100: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
8110: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e  est->eDest;.  in
8120: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
8130: 3e 69 53 44 50 61 72 6d 3b 0a 0a 20 20 69 6e 74  >iSDParm;..  int
8140: 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72   regRow;.  int r
8150: 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62  egRowid;..  iTab
8160: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43   = pOrderBy->iEC
8170: 75 72 73 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20  ursor;.  regRow 
8180: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
8190: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
81a0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
81b0: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
81c0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
81d0: 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20      pseudoTab = 
81e0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
81f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8200: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
8210: 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61  Pseudo, pseudoTa
8220: 62 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  b, regRow, nColu
8230: 6d 6e 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 69  mn);.    regRowi
8240: 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 0;.  }else{.
8250: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73      regRowid = s
8260: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
8270: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
8280: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
8290: 26 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29  & SF_UseSorter )
82a0: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72  {.    int regSor
82b0: 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tOut = ++pParse-
82c0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 70  >nMem;.    int p
82d0: 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
82e0: 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
82f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8300: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70  OP_OpenPseudo, p
8310: 74 61 62 32 2c 20 72 65 67 53 6f 72 74 4f 75 74  tab2, regSortOut
8320: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
8330: 72 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  r+2);.    addr =
8340: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
8350: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
8360: 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  terSort, iTab, a
8370: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63  ddrBreak);.    c
8380: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
8390: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
83a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
83b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
83c0: 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67  rData, iTab, reg
83d0: 53 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 73 71  SortOut);.    sq
83e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
83f0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 74  v, OP_Column, pt
8400: 61 62 32 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ab2, pOrderBy->n
8410: 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b  Expr+1, regRow);
8420: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8430: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8440: 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a  AG_CLEARCACHE);.
8450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
8460: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
8470: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8480: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
8490: 42 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f 64 65  Break);.    code
84a0: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64  Offset(v, p, add
84b0: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
84c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
84d0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
84e0: 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e  iTab, pOrderBy->
84f0: 6e 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29  nExpr+1, regRow)
8500: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
8510: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
8520: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
8530: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
8540: 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ab: {.      test
8550: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
8560: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
8570: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
8580: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
8590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
85a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
85b0: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
85c0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
85d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
85e0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
85f0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20   iParm, regRow, 
8600: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
8610: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8620: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
8630: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72  PPEND);.      br
8640: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
8650: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
8660: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
8670: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
8680: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
8690: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
86a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
86b0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
86c0: 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67  , regRow, 1, reg
86d0: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
86f0: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20  pDest->affSdst, 
8700: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8710: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
8720: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
8730: 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20   regRow, 1);.   
8740: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8750: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
8760: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
8770: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72  Rowid);.      br
8780: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8790: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
87a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
87b0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
87c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
87d0: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
87e0: 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  Row, iParm, 1);.
87f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
8800: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
8810: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
8820: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
8830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
8840: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
8850: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t: {.      int i
8860: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8870: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
8880: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
8890: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20  Coroutine ); .  
88a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
88b0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
88c0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
88d0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
88e0: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
88f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
8900: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
8910: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f     assert( regRo
8920: 77 21 3d 70 44 65 73 74 2d 3e 69 53 64 73 74 2b  w!=pDest->iSdst+
8930: 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i );.        sql
8940: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8950: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65  , OP_Column, pse
8960: 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74  udoTab, i, pDest
8970: 2d 3e 69 53 64 73 74 2b 69 29 3b 0a 20 20 20 20  ->iSdst+i);.    
8980: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
8990: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
89a0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
89b0: 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
89c0: 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  HE);.        }. 
89d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
89e0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
89f0: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ut ){.        sq
8a00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8a10: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
8a20: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e   pDest->iSdst, n
8a30: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
8a40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
8a50: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
8a60: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69  pParse, pDest->i
8a70: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
8a80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8a90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8aa0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
8ab0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
8ac0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
8ad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8ae0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
8af0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
8b00: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73  se, regRow);.  s
8b10: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
8b20: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
8b30: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 54 68  Rowid);..  /* Th
8b40: 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
8b50: 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
8b60: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
8b70: 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69  bel(v, addrConti
8b80: 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  nue);.  if( p->s
8b90: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
8ba0: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Sorter ){.    sq
8bb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8bc0: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
8bd0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20  , iTab, addr);. 
8be0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
8bf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8c00: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
8c10: 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  addr);.  }.  sql
8c20: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
8c30: 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61  abel(v, addrBrea
8c40: 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  k);.  if( eDest=
8c50: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
8c60: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
8c70: 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ine ){.    sqlit
8c80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8c90: 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f  OP_Close, pseudo
8ca0: 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  Tab, 0);.  }.}..
8cb0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
8cc0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
8cd0: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
8ce0: 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  e 'declaration t
8cf0: 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65  ype' of the.** e
8d00: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
8d10: 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20   The string may 
8d20: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74  be treated as st
8d30: 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c  atic by the call
8d40: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  er..**.** The de
8d50: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
8d60: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
8d70: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
8d80: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
8d90: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
8da0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
8db0: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
8dc0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
8dd0: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
8de0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
8df0: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
8e00: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
8e10: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
8e20: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
8e30: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
8e40: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
8e50: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
8e60: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
8e70: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
8e80: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
8e90: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
8ea0: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
8eb0: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
8ec0: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
8ed0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
8ee0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
8ef0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
8f00: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
8f10: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
8f20: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
8f30: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
8f40: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
8f50: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
8f60: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
8f70: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
8f80: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
8f90: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
8fa0: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
8fb0: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
8fc0: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
8fd0: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
8fe0: 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  ype(.  NameConte
8ff0: 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72  xt *pNC, .  Expr
9000: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
9010: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
9020: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
9030: 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a   **pzOriginTab,.
9040: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
9050: 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20  zOriginCol.){.  
9060: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
9070: 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
9080: 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d  nst *zOriginDb =
9090: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
90a0: 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30   *zOriginTab = 0
90b0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
90c0: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a  zOriginCol = 0;.
90d0: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 4e    int j;.  if( N
90e0: 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c  EVER(pExpr==0) |
90f0: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
9100: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
9110: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
9120: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
9130: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
9140: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
9150: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
9160: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9170: 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65  a column. Locate
9180: 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63   the table the c
9190: 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20  olumn is being. 
91a0: 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65       ** extracte
91b0: 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f  d from in NameCo
91c0: 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20  ntext.pSrcList. 
91d0: 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62  This table may b
91e0: 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20  e real.      ** 
91f0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
9200: 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20  r a subquery..  
9210: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
9220: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
9230: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
9240: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75  e structure colu
9250: 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  mn is extracted 
9260: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65  from */.      Se
9270: 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20  lect *pS = 0;   
9280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c            /* Sel
9290: 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ect the column i
92a0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
92b0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43   */.      int iC
92c0: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
92d0: 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f  umn;  /* Index o
92e0: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62  f column in pTab
92f0: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
9300: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9310: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
9320: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9330: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
9340: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68  LUMN );.      wh
9350: 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61  ile( pNC && !pTa
9360: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63  b ){.        Src
9370: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
9380: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
9390: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
93a0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
93b0: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
93c0: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70  j].iCursor!=pExp
93d0: 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a  r->iTable;j++);.
93e0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54          if( j<pT
93f0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a  abList->nSrc ){.
9400: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d            pTab =
9410: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
9420: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
9430: 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  pS = pTabList->a
9440: 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  [j].pSelect;.   
9450: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9460: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
9470: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
9480: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
9490: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
94a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e          /* At on
94b0: 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63  e time, code suc
94c0: 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77  h as "SELECT new
94d0: 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69  .x" within a tri
94e0: 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20  gger would.     
94f0: 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73     ** cause this
9500: 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75   condition to ru
9510: 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20  n.  Since then, 
9520: 77 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74  we have restruct
9530: 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20  ured how.       
9540: 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65   ** trigger code
9550: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e   is generated an
9560: 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74  d so this condit
9570: 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  ion is no longer
9580: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73   .        ** pos
9590: 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20  sible. However, 
95a0: 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20  it can still be 
95b0: 74 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65  true for stateme
95c0: 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20  nts like.       
95d0: 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
95e0: 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  g:.        **.  
95f0: 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54        **   CREAT
9600: 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49  E TABLE t1(col I
9610: 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20  NTEGER);.       
9620: 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45   **   SELECT (SE
9630: 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f  LECT t1.col) FRO
9640: 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  M FROM t1;.     
9650: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
9660: 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   when columnType
9670: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
9680: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  the expression "
9690: 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a  t1.col" in the .
96a0: 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73          ** sub-s
96b0: 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63  elect. In this c
96c0: 61 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c  ase, set the col
96d0: 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c  umn type to NULL
96e0: 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a  , even.        *
96f0: 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75  * though it shou
9700: 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e  ld really be "IN
9710: 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20  TEGER"..        
9720: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
9730: 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  is is not a prob
9740: 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75  lem, as the colu
9750: 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63  mn type of "t1.c
9760: 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20  ol" is never.   
9770: 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68       ** used. Wh
9780: 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20  en columnType() 
9790: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
97a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20   expression .   
97b0: 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54       ** "(SELECT
97c0: 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63   t1.col)", the c
97d0: 6f 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72  orrect type is r
97e0: 65 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65  eturned (see the
97f0: 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20   TK_SELECT.     
9800: 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c     ** branch bel
9810: 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ow.  */.        
9820: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
9830: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
9840: 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61  ab && pExpr->pTa
9850: 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20  b==pTab );.     
9860: 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20   if( pS ){.     
9870: 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65     /* The "table
9880: 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  " is actually a 
9890: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20  sub-select or a 
98a0: 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d  view in the FROM
98b0: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
98c0: 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ** of the SELECT
98d0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75   statement. Retu
98e0: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
98f0: 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67  on type and orig
9900: 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  in.        ** da
9910: 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ta for the resul
9920: 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  t-set column of 
9930: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a  the sub-select..
9940: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9950: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26     if( iCol>=0 &
9960: 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53  & ALWAYS(iCol<pS
9970: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
9980: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
9990: 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73   If iCol is less
99a0: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
99b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
99c0: 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20  requests the.   
99d0: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
99e0: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
99f0: 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20  t or view. This 
9a00: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65  expression is le
9a10: 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20  gal (see .      
9a20: 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65      ** test case
9a30: 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74   misc2.2.2) - it
9a40: 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65   always evaluate
9a50: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  s to NULL..     
9a60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
9a70: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
9a80: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  C;.          Exp
9a90: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
9aa0: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
9ab0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
9ac0: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
9ad0: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Src;.          s
9ae0: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
9af0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
9b00: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
9b10: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
9b20: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
9b30: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
9b40: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
9b50: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
9b60: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
9b70: 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
9b80: 59 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  YS(pTab->pSchema
9b90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
9ba0: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  A real table */.
9bb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9bc0: 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !pS );.        i
9bd0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
9be0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
9bf0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9c00: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
9c10: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
9c20: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
9c30: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
9c40: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
9c50: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
9c60: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e           zOrigin
9c70: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
9c80: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9c90: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
9ca0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
9cb0: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
9cc0: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70    zOriginCol = p
9cd0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9ce0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
9cf0: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e  .        zOrigin
9d00: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
9d10: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
9d20: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
9d30: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
9d40: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
9d50: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
9d60: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
9d70: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
9d80: 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e    zOriginDb = pN
9d90: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
9da0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
9db0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9dc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9dd0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
9de0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9df0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
9e00: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
9e10: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
9e20: 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  s a sub-select. 
9e30: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
9e40: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a  ration type and.
9e50: 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20        ** origin 
9e60: 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e  info for the sin
9e70: 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  gle column in th
9e80: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
9e90: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20  the SELECT.     
9ea0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20   ** statement.. 
9eb0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61       */.      Na
9ec0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
9ed0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
9ee0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
9ef0: 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ct;.      Expr *
9f00: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
9f10: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
9f20: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
9f30: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
9f40: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
9f50: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63  ;.      sNC.pSrc
9f60: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
9f70: 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  .      sNC.pNext
9f80: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e   = pNC;.      sN
9f90: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
9fa0: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54  pParse;.      zT
9fb0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
9fc0: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
9fd0: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
9fe0: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
9ff0: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
a000: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
a010: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69    .  if( pzOrigi
a020: 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nDb ){.    asser
a030: 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26  t( pzOriginTab &
a040: 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b  & pzOriginCol );
a050: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62  .    *pzOriginDb
a060: 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20   = zOriginDb;.  
a070: 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d    *pzOriginTab =
a080: 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20   zOriginTab;.   
a090: 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20   *pzOriginCol = 
a0a0: 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a  zOriginCol;.  }.
a0b0: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
a0c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
a0d0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
a0e0: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
a0f0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
a100: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
a110: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
a120: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
a130: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
a140: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
a150: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
a160: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
a170: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
a180: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
a190: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
a1a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
a1b0: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
a1c0: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
a1d0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
a1e0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
a1f0: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
a200: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a210: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
a220: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
a230: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
a240: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
a250: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
a260: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
a270: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
a280: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
a290: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
a2a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
a2b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
a2c0: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
a2d0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
a2e0: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
a2f0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
a300: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
a310: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
a320: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
a330: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
a340: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
a350: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
a360: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
a370: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
a380: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
a390: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
a3a0: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
a3b0: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
a3c0: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
a3d0: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
a3e0: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
a3f0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
a400: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
a410: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
a420: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
a430: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
a440: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
a450: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
a460: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
a470: 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  igDb, SQLITE_TRA
a480: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
a490: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
a4a0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
a4b0: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
a4c0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
a4d0: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
a4e0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
a4f0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
a500: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53  UMN, zOrigCol, S
a510: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
a520: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
a530: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
a540: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29  sNC, p, 0, 0, 0)
a550: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
a560: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
a570: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
a580: 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65  _DECLTYPE, zType
a590: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
a5a0: 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  NT);.  }.#endif 
a5b0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
a5c0: 45 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a  ECLTYPE */.}../*
a5d0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
a5e0: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
a5f0: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61   the VDBE the na
a600: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  mes of columns.*
a610: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
a620: 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  set.  This infor
a630: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
a640: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a  o provide the.**
a650: 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20   azCol[] values 
a660: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
a670: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a680: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
a690: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
a6a0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
a6b0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
a6c0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
a6d0: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
a6e0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
a6f0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
a700: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
a710: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
a720: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
a730: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
a740: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
a750: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
a760: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a770: 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73  .  int fullNames
a780: 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23  , shortNames;..#
a790: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a7a0: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
a7b0: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
a7c0: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
a7d0: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
a7e0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
a7f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
a800: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
a810: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
a820: 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d  Set || NEVER(v==
a830: 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
a840: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
a850: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
a860: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
a870: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
a880: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
a890: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
a8a0: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
a8b0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
a8c0: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
a8d0: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
a8e0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
a8f0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
a900: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
a910: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
a920: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
a930: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
a940: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
a950: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
a960: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
a970: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
a980: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
a990: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
a9a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
a9b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a9c0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
a9d0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
a9e0: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
a9f0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
aa00: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
aa10: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
aa20: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
aa30: 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74  UMN) && pTabList
aa40: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
aa50: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
aa60: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
aa70: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
aa80: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
aa90: 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54  j=0; ALWAYS(j<pT
aaa0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a  abList->nSrc); j
aab0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
aac0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
aad0: 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62  iCursor==p->iTab
aae0: 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  le ) break;.    
aaf0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
ab00: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
ab10: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
ab20: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
ab30: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
ab40: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
ab50: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
ab60: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
ab70: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
ab80: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
ab90: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
aba0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
abb0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
abc0: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
abd0: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
abe0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
abf0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
ac00: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
ac10: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
ac20: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
ac30: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
ac40: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
ac50: 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20  AME_NAME, .     
ac60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
ac70: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
ac80: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
ac90: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
aca0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
acb0: 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20   fullNames ){.  
acc0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
acd0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
ace0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
acf0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
ad00: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
ad10: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
ad20: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ad30: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ad40: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
ad50: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
ad60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ad70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ad80: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
ad90: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
ada0: 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
adb0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
adc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
add0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
ade0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
adf0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
ae00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
ae10: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
ae20: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
ae30: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
ae40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
ae50: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
ae60: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
ae70: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  t, pEList);.}../
ae80: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20  *.** Given a an 
ae90: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
aea0: 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79  (which is really
aeb0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70   the list of exp
aec0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
aed0: 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74   form the result
aee0: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
aef0: 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70   statement) comp
af00: 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  ute appropriate.
af10: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ** column names 
af20: 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74  for a table that
af30: 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
af40: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
af50: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d  .**.** All colum
af60: 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20  n names will be 
af70: 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  unique..**.** On
af80: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
af90: 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64  mes are computed
afa0: 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c  .  Column.zType,
afb0: 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a   Column.zColl,.*
afc0: 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
afd0: 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65  ds of Column are
afe0: 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   zeroed..**.** R
aff0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
b000: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
b010: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
b020: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
b030: 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20  ,.** store NULL 
b040: 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20  in *paCol and 0 
b050: 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65  in *pnCol and re
b060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b070: 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  M..*/.static int
b080: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
b090: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
b0a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b0b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
b0c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
b0d0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
b0e0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69        /* Expr li
b0f0: 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  st from which to
b100: 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e   derive column n
b110: 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70  ames */.  i16 *p
b120: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
b130: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
b140: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
b150: 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d   here */.  Colum
b160: 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20  n **paCol       
b170: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
b180: 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  new column list 
b190: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
b1a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b1b0: 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61  e->db;   /* Data
b1c0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
b1d0: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b200: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  s */.  int cnt; 
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65     /* Index adde
b230: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61  d to make the na
b240: 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43  me unique */.  C
b250: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43  olumn *aCol, *pC
b260: 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ol;        /* Fo
b270: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72  r looping over r
b280: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
b290: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b2b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
b2c0: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
b2d0: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20  t set */.  Expr 
b2e0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
b2f0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
b300: 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c  sion for a singl
b310: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
b320: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
b330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b340: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
b350: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b370: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65   /* Size of name
b380: 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a   in zName[] */..
b390: 20 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a    if( pEList ){.
b3a0: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73      nCol = pELis
b3b0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43  t->nExpr;.    aC
b3c0: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ol = sqlite3DbMa
b3d0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
b3e0: 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f  eof(aCol[0])*nCo
b3f0: 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  l);.    testcase
b400: 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d  ( aCol==0 );.  }
b410: 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
b420: 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30   0;.    aCol = 0
b430: 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d  ;.  }.  *pnCol =
b440: 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20   nCol;.  *paCol 
b450: 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69  = aCol;..  for(i
b460: 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
b470: 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  <nCol; i++, pCol
b480: 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20  ++){.    /* Get 
b490: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e  an appropriate n
b4a0: 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ame for the colu
b4b0: 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20  mn.    */.    p 
b4c0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
b4d0: 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
b4e0: 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c  ( p->pRight==0 |
b4f0: 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
b500: 79 28 70 2d 3e 70 52 69 67 68 74 2c 20 45 50 5f  y(p->pRight, EP_
b510: 49 6e 74 56 61 6c 75 65 29 0a 20 20 20 20 20 20  IntValue).      
b520: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 70           || p->p
b530: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d  Right->u.zToken=
b540: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d  =0 || p->pRight-
b550: 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20  >u.zToken[0]!=0 
b560: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d  );.    if( (zNam
b570: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
b580: 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  .zName)!=0 ){.  
b590: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
b5a0: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lumn contains an
b5b0: 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72   "AS <name>" phr
b5c0: 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20  ase, use <name> 
b5d0: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
b5e0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
b5f0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b600: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
b610: 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
b620: 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f  pColExpr = p;  /
b630: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
b640: 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73   that is the res
b650: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
b660: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
b670: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  pTab;         /*
b680: 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   Table associate
b690: 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72  d with this expr
b6a0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
b6b0: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
b6c0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
b6d0: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
b6e0: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
b6f0: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
b700: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
b710: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b720: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
b730: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
b740: 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d  ALWAYS(pColExpr-
b750: 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
b760: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
b770: 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
b780: 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
b790: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
b7a0: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
b7b0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  lumn;.        pT
b7c0: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
b7d0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Tab;.        if(
b7e0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
b7f0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
b800: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
b810: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
b820: 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
b830: 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20          iCol>=0 
b840: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
b850: 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
b860: 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  d");.      }else
b870: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
b880: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
b890: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
b8a0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
b8b0: 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
b8c0: 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
b8d0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
b8e0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
b8f0: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
b900: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
b910: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  {.        /* Use
b920: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
b930: 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  xt of the column
b940: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69   expression as i
b950: 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  ts name */.     
b960: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
b970: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
b980: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
b990: 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
b9a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
b9b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b9c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b9d0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
b9e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b9f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
ba00: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
ba10: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
ba20: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
ba30: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
ba40: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
ba50: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
ba60: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
ba70: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
ba80: 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d    */.    nName =
ba90: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
baa0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
bab0: 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a  (j=cnt=0; j<i; j
bac0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
bad0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43  qlite3StrICmp(aC
bae0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  ol[j].zName, zNa
baf0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
bb00: 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65    char *zNewName
bb10: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b  ;.        zName[
bb20: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
bb30: 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73      zNewName = s
bb40: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
bb50: 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65  , "%s:%d", zName
bb60: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
bb70: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
bb80: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
bb90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77      zName = zNew
bba0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20  Name;.        j 
bbb0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  = -1;.        if
bbc0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
bbd0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
bbe0: 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
bbf0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  e = zName;.  }. 
bc00: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
bc10: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72  ailed ){.    for
bc20: 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
bc30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
bc40: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d  Free(db, aCol[j]
bc50: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
bc60: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
bc70: 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20  (db, aCol);.    
bc80: 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *paCol = 0;.    
bc90: 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *pnCol = 0;.    
bca0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
bcb0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
bcc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
bcd0: 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61  /*.** Add type a
bce0: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
bcf0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f  ormation to a co
bd00: 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20  lumn list based 
bd10: 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73  on.** a SELECT s
bd20: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a  tatement..** .**
bd30: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
bd40: 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65   presumably came
bd50: 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75   from selectColu
bd60: 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c  mnNamesFromExprL
bd70: 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f  ist()..** The co
bd80: 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e  lumn list has on
bd90: 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79  ly names, not ty
bda0: 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  pes or collation
bdb0: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  s.  This.** rout
bdc0: 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68  ine goes through
bdd0: 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79   and adds the ty
bde0: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
bdf0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
be00: 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20  outine requires 
be10: 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66  that all identif
be20: 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  iers in the SELE
be30: 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  CT.** statement 
be40: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
be50: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
be60: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
be70: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50  ndCollation(.  P
be80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
be90: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
bea0: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 69 6e  contexts */.  in
beb0: 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t nCol,         
bec0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bed0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f   columns */.  Co
bee0: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20 20 20  lumn *aCol,     
bef0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63      /* List of c
bf00: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53 65 6c 65  olumns */.  Sele
bf10: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
bf20: 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64    /* SELECT used
bf30: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79   to determine ty
bf40: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
bf50: 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ns */.){.  sqlit
bf60: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
bf70: 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  >db;.  NameConte
bf80: 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e  xt sNC;.  Column
bf90: 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65   *pCol;.  CollSe
bfa0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
bfb0: 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  i;.  Expr *p;.  
bfc0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
bfd0: 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65  item *a;..  asse
bfe0: 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
bff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
c000: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
c010: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
c020: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43   );.  assert( nC
c030: 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ol==pSelect->pEL
c040: 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62  ist->nExpr || db
c050: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c060: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
c070: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
c080: 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  n;.  memset(&sNC
c090: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
c0a0: 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  );.  sNC.pSrcLis
c0b0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
c0c0: 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74  c;.  a = pSelect
c0d0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  ->pEList->a;.  f
c0e0: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
c0f0: 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
c100: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  pCol++){.    p =
c110: 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
c120: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
c130: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c140: 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73  b, columnType(&s
c150: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29  NC, p, 0, 0, 0))
c160: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
c170: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
c180: 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20  prAffinity(p);. 
c190: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66     if( pCol->aff
c1a0: 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d  inity==0 ) pCol-
c1b0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
c1c0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
c1d0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
c1e0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
c1f0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  se, p);.    if( 
c200: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
c210: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
c220: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
c230: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
c240: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
c250: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
c260: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
c270: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
c280: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
c290: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
c2a0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
c2b0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
c2c0: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
c2d0: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
c2e0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
c2f0: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
c300: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
c310: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c320: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61  se->db;.  int sa
c330: 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76  vedFlags;..  sav
c340: 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  edFlags = db->fl
c350: 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ags;.  db->flags
c360: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c   &= ~SQLITE_Full
c370: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e  ColNames;.  db->
c380: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
c390: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20  ShortColNames;. 
c3a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
c3b0: 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ep(pParse, pSele
c3c0: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50  ct, 0);.  if( pP
c3d0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
c3e0: 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  urn 0;.  while( 
c3f0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
c400: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
c410: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  ect->pPrior;.  d
c420: 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64  b->flags = saved
c430: 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20  Flags;.  pTab = 
c440: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
c450: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
c460: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
c470: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
c480: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
c490: 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75   The sqlite3Resu
c4a0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
c4b0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63  is only used n c
c4c0: 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f  ontexts where lo
c4d0: 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20  okaside.  ** is 
c4e0: 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73  disabled */.  as
c4f0: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
c500: 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20  ide.bEnabled==0 
c510: 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  );.  pTab->nRef 
c520: 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  = 1;.  pTab->zNa
c530: 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e  me = 0;.  pTab->
c540: 6e 52 6f 77 45 73 74 20 3d 20 31 30 30 30 30 30  nRowEst = 100000
c550: 30 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d  0;.  selectColum
c560: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
c570: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
c580: 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
c590: 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
c5a0: 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f  );.  selectAddCo
c5b0: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
c5c0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
c5d0: 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61  b->nCol, pTab->a
c5e0: 43 6f 6c 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  Col, pSelect);. 
c5f0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
c600: 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  1;.  if( db->mal
c610: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
c620: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
c630: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
c640: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c650: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
c660: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
c670: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
c680: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
c690: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
c6a0: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
c6b0: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
c6c0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
c6d0: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
c6e0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
c6f0: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
c700: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
c710: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
c720: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
c730: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
c740: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
c750: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
c760: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
c770: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e  Parse->db);.#ifn
c780: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c790: 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 76 20  TRACE.    if( v 
c7a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c7b0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
c7c0: 5f 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23  _Trace);.    }.#
c7d0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
c7e0: 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn v;.}.../*.** 
c7f0: 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
c800: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
c810: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
c820: 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
c830: 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
c840: 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
c850: 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20  ns.  pLimit and 
c860: 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  pOffset hold the
c870: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
c880: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
c890: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
c8a0: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
c8b0: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
c8c0: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
c8d0: 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
c8e0: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
c8f0: 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
c900: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
c910: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
c920: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
c930: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
c940: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
c950: 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
c960: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
c970: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
c980: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
c990: 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
c9a0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
c9b0: 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
c9c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c9d0: 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
c9e0: 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61  lues of iLimit a
c9f0: 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
ca00: 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
ca10: 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
ca20: 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64  ed by pLimit and
ca30: 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   pOffset.  iLimi
ca40: 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
ca50: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
ca60: 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
ca70: 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
ca80: 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c  values.** (usual
ca90: 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79  ly but not alway
caa0: 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63  s -1) prior to c
cab0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
cac0: 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ine..** Only if 
cad0: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
cae0: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
caf0: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
cb00: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
cb10: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
cb20: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
cb30: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
cb40: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
cb50: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
cb60: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
cb70: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
cb80: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
cb90: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
cba0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
cbb0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
cbc0: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
cbd0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
cbe0: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
cbf0: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
cc00: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
cc10: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
cc20: 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28   addr1, n;.  if(
cc30: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74   p->iLimit ) ret
cc40: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  urn;..  /* .  **
cc50: 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
cc60: 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
cc70: 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
cc80: 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72  e.  ** contraver
cc90: 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
cca0: 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
ccb0: 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
ccc0: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
ccd0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
cce0: 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
ccf0: 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
cd00: 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
cd10: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
cd20: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
cd30: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
cd40: 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69  set==0 || p->pLi
cd50: 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  mit!=0 );.  if( 
cd60: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
cd70: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69   p->iLimit = iLi
cd80: 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  mit = ++pParse->
cd90: 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71  nMem;.    v = sq
cda0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
cdb0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45  rse);.    if( NE
cdc0: 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
cdd0: 72 6e 3b 20 20 2f 2a 20 56 44 42 45 20 73 68 6f  rn;  /* VDBE sho
cde0: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
cdf0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
ce00: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
ce10: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
ce20: 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29  p->pLimit, &n) )
ce30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
ce40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ce50: 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d  Integer, n, iLim
ce60: 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  it);.      VdbeC
ce70: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
ce80: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
ce90: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
cea0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ceb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cec0: 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29  Goto, 0, iBreak)
ced0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cee0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53         if( p->nS
cef0: 65 6c 65 63 74 52 6f 77 20 3e 20 28 64 6f 75 62  electRow > (doub
cf00: 6c 65 29 6e 20 29 20 70 2d 3e 6e 53 65 6c 65 63  le)n ) p->nSelec
cf10: 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 6e  tRow = (double)n
cf20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
cf30: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
cf40: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
cf50: 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c  e, p->pLimit, iL
cf60: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
cf70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
cf80: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
cf90: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
cfa0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
cfb0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
cfc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cfd0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cfe0: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20  IfZero, iLimit, 
cff0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20  iBreak);.    }. 
d000: 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65     if( p->pOffse
d010: 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  t ){.      p->iO
d020: 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20  ffset = iOffset 
d030: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d040: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
d050: 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c  nMem++;   /* All
d060: 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72  ocate an extra r
d070: 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69  egister for limi
d080: 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  t+offset */.    
d090: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d0a0: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66  e(pParse, p->pOf
d0b0: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a  fset, iOffset);.
d0c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d0d0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
d0e0: 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74  stBeInt, iOffset
d0f0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
d100: 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54  ment((v, "OFFSET
d110: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
d120: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
d130: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d140: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
d150: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
d160: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d170: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f  P_Integer, 0, iO
d180: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
d190: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d1a0: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
d1b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d1c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
d1d0: 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c  iLimit, iOffset,
d1e0: 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20   iOffset+1);.   
d1f0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
d200: 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54  v, "LIMIT+OFFSET
d210: 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  "));.      addr1
d220: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d230: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
d240: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
d250: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d260: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
d270: 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29  , -1, iOffset+1)
d280: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d290: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
d2a0: 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ddr1);.    }.  }
d2b0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
d2c0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
d2d0: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
d2e0: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
d2f0: 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
d300: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
d310: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
d320: 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
d330: 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
d340: 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
d350: 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
d360: 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
d370: 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
d380: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
d390: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
d3a0: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
d3b0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
d3c0: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
d3d0: 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
d3e0: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
d3f0: 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
d400: 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
d410: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
d420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
d430: 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
d440: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
d450: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
d460: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
d470: 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
d480: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
d490: 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
d4a0: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
d4b0: 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
d4c0: 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
d4d0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
d4e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43    }.  assert( iC
d4f0: 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ol>=0 );.  if( p
d500: 52 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Ret==0 && iCol<p
d510: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
d520: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  ){.    pRet = sq
d530: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
d540: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
d550: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
d560: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
d570: 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20   pRet;.}.#endif 
d580: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
d590: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
d5a0: 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
d5b0: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
d5c0: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
d5d0: 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
d5e0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d5f0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d600: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
d610: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
d620: 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
d630: 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
d640: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
d650: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
d660: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
d670: 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
d680: 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66  ults */.);...#if
d690: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d6a0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
d6b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d6c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
d6d0: 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f   process a compo
d6e0: 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66  und query form f
d6f0: 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f  rom.** two or mo
d700: 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
d710: 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c  ies using UNION,
d720: 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45   UNION ALL, EXCE
d730: 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53  PT, or.** INTERS
d740: 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  ECT.**.** "p" po
d750: 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
d760: 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
d770: 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
d780: 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
d790: 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
d7a0: 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
d7b0: 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
d7c0: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
d7d0: 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
d7e0: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
d7f0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
d800: 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
d810: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
d820: 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
d830: 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
d840: 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
d850: 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
d860: 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
d870: 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
d880: 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
d890: 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
d8a0: 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
d8b0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
d8c0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
d8d0: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
d8e0: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
d8f0: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
d900: 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
d910: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
d920: 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
d930: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
d940: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
d950: 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
d960: 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
d970: 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
d990: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
d9a0: 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
d9b0: 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
d9c0: 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
d9d0: 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
d9e0: 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
d9f0: 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
da00: 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
da10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
da20: 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
da30: 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
da40: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
da50: 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
da60: 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
da70: 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
da80: 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
da90: 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
daa0: 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
dab0: 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
dac0: 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
dad0: 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
dae0: 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
daf0: 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
db00: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
db10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
db20: 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72  ltiSelect(.  Par
db30: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
db40: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
db50: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
db60: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
db70: 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
db80: 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
db90: 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
dba0: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
dbb0: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
dbc0: 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
dbd0: 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
dbe0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
dbf0: 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  ;   /* Success c
dc00: 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
dc10: 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
dc20: 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
dc30: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
dc40: 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
dc50: 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
dc60: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
dc70: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
dc80: 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
dc90: 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
dca0: 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f  est dest;      /
dcb0: 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61  * Alternative da
dcc0: 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a  ta destination *
dcd0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c  /.  Select *pDel
dce0: 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61  ete = 0;  /* Cha
dcf0: 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c  in of simple sel
dd00: 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ects to delete *
dd10: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
dd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
dd30: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
dd40: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
dd50: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
dd60: 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20    int iSub1;    
dd70: 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
dd80: 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71  d of left-hand q
dd90: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53  uery */.  int iS
dda0: 75 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub2;            
ddb0: 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67  /* EQP id of rig
ddc0: 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ht-hand query */
ddd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
dde0: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
ddf0: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
de00: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
de10: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
de20: 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
de30: 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
de40: 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
de50: 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
de60: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
de70: 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  IT..  */.  asser
de80: 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f  t( p && p->pPrio
de90: 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  r );  /* Calling
dea0: 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e   function guaran
deb0: 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a  tees this much *
dec0: 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
ded0: 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  >db;.  pPrior = 
dee0: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
def0: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
df00: 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20  ghtmost!=pPrior 
df10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  );.  assert( pPr
df20: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ior->pRightmost=
df30: 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29  =p->pRightmost )
df40: 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
df50: 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
df60: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
df70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
df80: 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42  (pParse,"ORDER B
df90: 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
dfa0: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
dfb0: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
dfc0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
dfd0: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
dfe0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
dff0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
e000: 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
e010: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
e020: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e030: 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
e040: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
e050: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
e060: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
e070: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
e080: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
e090: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
e0a0: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76  ct_end;.  }..  v
e0b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
e0c0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
e0d0: 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a  ert( v!=0 );  /*
e0e0: 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64   The VDBE alread
e0f0: 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c  y created by cal
e100: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
e110: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
e120: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
e130: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
e140: 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
e150: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
e160: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
e170: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
e180: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  >pEList );.    s
e190: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e1a0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
e1b0: 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61  eral, dest.iSDPa
e1c0: 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rm, p->pEList->n
e1d0: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
e1e0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
e1f0: 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
e200: 44 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  D);.    dest.eDe
e210: 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
e220: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
e230: 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
e240: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
e250: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
e260: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
e270: 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
e280: 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
e290: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
e2a0: 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
e2b0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
e2c0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
e2d0: 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
e2e0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
e2f0: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
e300: 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20  & SF_Values ){. 
e310: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
e320: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c  rMsg(pParse, "al
e330: 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61  l VALUES must ha
e340: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
e350: 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20  er of terms");. 
e360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e370: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e380: 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
e390: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
e3a0: 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
e3b0: 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
e3c0: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
e3d0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
e3e0: 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
e3f0: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
e400: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a    }.    rc = 1;.
e410: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e420: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
e430: 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45    /* Compound SE
e440: 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20  LECTs that have 
e450: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
e460: 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  se are handled s
e470: 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  eparately..  */.
e480: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
e490: 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
e4a0: 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
e4b0: 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  By(pParse, p, pD
e4c0: 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  est);.  }..  /* 
e4d0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
e4e0: 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  r the left and r
e4f0: 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74  ight SELECT stat
e500: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73  ements..  */.  s
e510: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
e520: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
e530: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
e540: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
e550: 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61   nLimit;.      a
e560: 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
e570: 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
e580: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
e590: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
e5a0: 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65    pPrior->pOffse
e5b0: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
e5c0: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
e5d0: 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
e5e0: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
e5f0: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
e600: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
e610: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
e620: 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  &dest);.      p-
e630: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
e640: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
e650: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  0;.      if( rc 
e660: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
e670: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
e680: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e690: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
e6a0: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
e6b0: 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
e6c0: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
e6d0: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66  t = pPrior->iOff
e6e0: 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  set;.      if( p
e6f0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
e700: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
e710: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e720: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
e730: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56  imit);.        V
e740: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e750: 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49  Jump ahead if LI
e760: 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a  MIT reached"));.
e770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78        }.      ex
e780: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
e790: 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
e7a0: 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
e7b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e7c0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
e7d0: 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  p, &dest);.     
e7e0: 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
e7f0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
e800: 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
e810: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
e820: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
e830: 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
e840: 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e  tRow += pPrior->
e850: 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
e860: 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
e870: 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73  imit.       && s
e880: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
e890: 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  ger(pPrior->pLim
e8a0: 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20  it, &nLimit).   
e8b0: 20 20 20 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63      && p->nSelec
e8c0: 74 52 6f 77 20 3e 20 28 64 6f 75 62 6c 65 29 6e  tRow > (double)n
e8d0: 4c 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a  Limit .      ){.
e8e0: 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
e8f0: 63 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29  ctRow = (double)
e900: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a  nLimit;.      }.
e910: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29        if( addr )
e920: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e930: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
e940: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a   addr);.      }.
e950: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e960: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
e970: 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
e980: 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
e990: 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
e9a0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
e9b0: 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
e9c0: 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
e9d0: 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
e9e0: 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20     u8 op = 0;   
e9f0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
ea00: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
ea10: 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
ea20: 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
ea30: 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
ea40: 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
ea50: 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
ea60: 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
ea70: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
ea80: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
ea90: 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
eaa0: 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
eab0: 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
eac0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
ead0: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e     SelectDest un
eae0: 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20  iondest;..      
eaf0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
eb00: 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20  =TK_EXCEPT );.  
eb10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
eb20: 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
eb30: 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d  .      priorOp =
eb40: 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
eb50: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
eb60: 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 41 4c 57  ==priorOp && ALW
eb70: 41 59 53 28 21 70 2d 3e 70 4c 69 6d 69 74 20 26  AYS(!p->pLimit &
eb80: 26 21 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b  &!p->pOffset) ){
eb90: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63  .        /* We c
eba0: 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
ebb0: 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
ebc0: 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
ebd0: 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
ebe0: 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20  ** right..      
ebf0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
ec00: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
ec10: 73 74 21 3d 70 20 29 3b 20 20 2f 2a 20 43 61 6e  st!=p );  /* Can
ec20: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 72   only happen for
ec30: 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
ec40: 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ts.             
ec50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec60: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20          ** of a 
ec70: 33 2d 77 61 79 20 6f 72 20 6d 6f 72 65 20 63 6f  3-way or more co
ec80: 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20  mpound */.      
ec90: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
eca0: 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  mit==0 );      /
ecb0: 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
ecc0: 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
ecd0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ts */.        as
ece0: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
ecf0: 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f  ==0 );     /* No
ed00: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
ed10: 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
ed20: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
ed30: 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  ab = dest.iSDPar
ed40: 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
ed50: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
ed60: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
ed70: 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
ed80: 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
ed90: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
eda0: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
edb0: 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
edc0: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
edd0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
ede0: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b++;.        ass
edf0: 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
ee00: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
ee10: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
ee20: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
ee30: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69  enEphemeral, uni
ee40: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
ee50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
ee60: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
ee70: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
ee80: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
ee90: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
eea0: 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d    p->pRightmost-
eeb0: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
eec0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
eed0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
eee0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
eef0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
ef00: 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
ef10: 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
ef20: 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
ef30: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
ef40: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
ef50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
ef60: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e  lectDestInit(&un
ef70: 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70  iondest, priorOp
ef80: 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20  , unionTab);.   
ef90: 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
efa0: 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
efb0: 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
efc0: 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
efd0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
efe0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
eff0: 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
f000: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
f010: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f020: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
f030: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
f040: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
f050: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
f060: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
f070: 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
f080: 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
f090: 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
f0a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f0b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
f0c0: 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
f0d0: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e       op = SRT_Un
f0e0: 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ion;.      }.   
f0f0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
f100: 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
f110: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
f120: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
f130: 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
f140: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
f150: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
f160: 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
f170: 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
f180: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
f190: 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
f1a0: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
f1b0: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
f1c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
f1d0: 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e  Parse, p, &union
f1e0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
f1f0: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
f200: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a  E_OK );.      /*
f210: 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e   Query flattenin
f220: 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  g in sqlite3Sele
f230: 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c  ct() might refil
f240: 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20  l p->pOrderBy.. 
f250: 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20       ** Be sure 
f260: 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72  to delete p->pOr
f270: 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65  derBy, therefore
f280: 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d  , to avoid a mem
f290: 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20  ory leak. */.   
f2a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
f2b0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
f2c0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
f2d0: 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
f2e0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
f2f0: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
f300: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
f310: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
f320: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
f330: 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
f340: 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
f350: 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71  ectRow;.      sq
f360: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
f370: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
f380: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
f390: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
f3a0: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
f3b0: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  fset;.      p->i
f3c0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
f3d0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
f3e0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
f3f0: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
f400: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
f410: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
f420: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
f430: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
f440: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
f450: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
f460: 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65  rt( unionTab==de
f470: 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65  st.iSDParm || de
f480: 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
f490: 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  p );.      if( d
f4a0: 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
f4b0: 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  Op ){.        in
f4c0: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
f4d0: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
f4e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
f4f0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
f500: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
f510: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
f520: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
f530: 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
f540: 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
f550: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
f560: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
f570: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67  ior;.          g
f580: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
f590: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
f5a0: 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
f5b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f5c0: 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
f5d0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
f5e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74  );.        iCont
f5f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
f600: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
f610: 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
f620: 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
f630: 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
f640: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f650: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
f660: 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  wind, unionTab, 
f670: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
f680: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
f690: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
f6a0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  (v);.        sel
f6b0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
f6c0: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
f6d0: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e  t, unionTab, p->
f6e0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f700: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
f710: 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
f720: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
f730: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
f740: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
f750: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f760: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
f770: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
f780: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
f790: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
f7a0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
f7b0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
f7c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f7d0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
f7e0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Tab, 0);.      }
f7f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f800: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
f810: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
f820: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
f830: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
f840: 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
f850: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
f860: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
f870: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
f880: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
f890: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
f8a0: 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
f8b0: 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
f8c0: 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
f8d0: 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
f8e0: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
f8f0: 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
f900: 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
f910: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
f920: 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
f930: 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
f940: 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
f950: 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
f960: 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
f970: 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
f980: 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
f990: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
f9a0: 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
f9b0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
f9c0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
f9d0: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  rderBy==0 );..  
f9e0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
f9f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fa00: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
fa10: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
fa20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
fa30: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
fa40: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
fa50: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
fa60: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
fa70: 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46  pRightmost->selF
fa80: 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
fa90: 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
faa0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
fab0: 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
fac0: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
fad0: 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
fae0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
faf0: 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
fb00: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
fb10: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
fb20: 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
fb30: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
fb40: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
fb50: 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
fb60: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
fb70: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
fb80: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
fb90: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
fba0: 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
fbb0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
fbc0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
fbd0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
fbe0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
fbf0: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
fc00: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
fc10: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
fc20: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
fc30: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
fc40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fc50: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
fc60: 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
fc70: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
fc80: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
fc90: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
fca0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
fcb0: 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
fcc0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
fcd0: 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
fce0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
fcf0: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
fd00: 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
fd10: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
fd20: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
fd30: 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
fd40: 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32  t.iSDParm = tab2
fd50: 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
fd60: 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
fd70: 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
fd80: 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
fd90: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
fda0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e  t(pParse, p, &in
fdb0: 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
fdc0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
fdd0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
fde0: 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
fdf0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
fe00: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
fe10: 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
fe20: 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69  >nSelectRow>pPri
fe30: 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
fe40: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
fe50: 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
fe60: 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
fe70: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
fe80: 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
fe90: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
fea0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
feb0: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
fec0: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  t;..      /* Gen
fed0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
fee0: 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
fef0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
ff00: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
ff10: 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
ff20: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
ff30: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
ff40: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
ff50: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
ff60: 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  {.        Select
ff70: 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
ff80: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
ff90: 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
ffa0: 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
ffb0: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67  Prior;.        g
ffc0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
ffd0: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
ffe0: 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
fff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72       }.      iBr
10000 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
10010 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
10020 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
10030 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
10040 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70  l(v);.      comp
10050 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
10060 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
10070 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
10080 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10090 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31   OP_Rewind, tab1
100a0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
100b0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
100c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
100d0 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
100e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
100f0 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20  2(v, OP_RowKey, 
10100 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  tab1, r1);.     
10110 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10120 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
10130 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
10140 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  t, r1, 0);.     
10150 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
10160 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
10170 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  1);.      select
10180 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
10190 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
101a0 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  tab1, p->pEList-
101b0 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
101d0 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
101e0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
101f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
10200 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
10210 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
10220 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10230 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
10240 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
10250 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
10260 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
10270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10280 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
10290 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
102a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
102b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
102c0 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
102d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
102e0 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e  }.  }..  explain
102f0 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
10300 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
10310 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b  iSub2, p->op!=TK
10320 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  _ALL);..  /* Com
10330 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  pute collating s
10340 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79  equences used by
10350 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
10360 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
10370 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
10380 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
10390 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
103a0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
103b0 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
103c0 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  ary tables..  **
103d0 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
103e0 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
103f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
10400 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
10410 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
10420 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
10430 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
10440 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
10450 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
10460 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
10470 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
10480 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
10490 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
104a0 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
104b0 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
104c0 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
104d0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
104e0 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20  F_UsesEphemeral 
104f0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10510 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
10520 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
10530 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
10540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
10550 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
10560 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
10570 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
10580 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
10590 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
105a0 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
105b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
105c0 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
105d0 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  **apColl;       
105e0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
105f0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65  ping through pKe
10600 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
10610 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10630 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10640 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
10650 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61  lt set */..    a
10660 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
10670 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e  most==p );.    n
10680 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
10690 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
106a0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
106b0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20  MallocZero(db,. 
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106d0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b        sizeof(*pK
106e0 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28 73 69  eyInfo)+nCol*(si
106f0 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b  zeof(CollSeq*) +
10700 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70   1));.    if( !p
10710 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
10720 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
10730 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  EM;.      goto m
10740 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
10750 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79  .    }..    pKey
10760 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
10770 64 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  db);.    pKeyInf
10780 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  o->nField = (u16
10790 29 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  )nCol;..    for(
107a0 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
107b0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
107c0 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
107d0 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
107e0 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
107f0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
10800 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
10810 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
10820 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
10830 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
10840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10850 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72    pKeyInfo->aSor
10860 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 61 70  tOrder = (u8*)ap
10870 43 6f 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 70  Coll;..    for(p
10880 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
10890 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
108a0 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
108b0 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
108c0 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
108d0 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
108e0 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
108f0 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
10900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
10910 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
10920 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
10930 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
10940 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
10950 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
10960 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
10970 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
10980 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
10990 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
109a0 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
109b0 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
109c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
109d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
109e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
109f0 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
10a00 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
10a10 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
10a20 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
10a30 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
10a40 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
10a50 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
10a60 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
10a70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
10a80 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
10a90 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a   pKeyInfo);.  }.
10aa0 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
10ab0 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73  d:.  pDest->iSds
10ac0 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
10ad0 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
10ae0 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73   dest.nSdst;.  s
10af0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
10b00 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b  te(db, pDelete);
10b10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10b20 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10b30 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
10b40 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
10b50 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73  Code an output s
10b60 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20  ubroutine for a 
10b70 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  coroutine implem
10b80 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a  entation of a.**
10b90 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74   SELECT statment
10ba0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ..**.** The data
10bb0 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73   to be output is
10bc0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49   contained in pI
10bd0 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65  n->iSdst.  There
10be0 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64   are.** pIn->nSd
10bf0 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  st columns to be
10c00 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20   output.  pDest 
10c10 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74  is where the out
10c20 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  put should.** be
10c30 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67   sent..**.** reg
10c40 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75  Return is the nu
10c50 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69  mber of the regi
10c60 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ster holding the
10c70 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72   subroutine.** r
10c80 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a  eturn address..*
10c90 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e  *.** If regPrev>
10ca0 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  0 then it is the
10cb0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
10cc0 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74  in a vector that
10cd0 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20  .** records the 
10ce0 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
10cf0 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69    mem[regPrev] i
10d00 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73  s a flag that is
10d10 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65   false.** if the
10d20 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70  re has been no p
10d30 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
10d40 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
10d50 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65  en code is.** ge
10d60 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72  nerated to suppr
10d70 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20  ess duplicates. 
10d80 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65   pKeyInfo is use
10d90 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a  d for comparing.
10da0 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49  ** keys..**.** I
10db0 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e  f the LIMIT foun
10dc0 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69  d in p->iLimit i
10dd0 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20  s reached, jump 
10de0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a  immediately to.*
10df0 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61  * iBreak..*/.sta
10e00 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65  tic int generate
10e10 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
10e20 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10e30 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
10e40 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
10e50 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
10e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10e70 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
10e80 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ent */.  SelectD
10e90 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20  est *pIn,       
10ea0 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75   /* Coroutine su
10eb0 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a  pplying data */.
10ec0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
10ed0 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65  est,      /* Whe
10ee0 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64  re to send the d
10ef0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ata */.  int reg
10f00 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20  Return,         
10f10 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61   /* The return a
10f20 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
10f30 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
10f40 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
10f50 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20  Previous result 
10f60 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e  register.  No un
10f70 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f  iqueness if 0 */
10f80 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
10f90 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f  Info,      /* Fo
10fa0 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68  r comparing with
10fb0 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
10fc0 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 2c  */.  int p4type,
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10fe0 54 68 65 20 70 34 20 74 79 70 65 20 66 6f 72 20  The p4 type for 
10ff0 70 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e  pKeyInfo */.  in
11000 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
11010 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
11020 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65  re if we hit the
11030 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56   LIMIT */.){.  V
11040 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
11050 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43  >pVdbe;.  int iC
11060 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61  ontinue;.  int a
11070 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73  ddr;..  addr = s
11080 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
11090 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e  tAddr(v);.  iCon
110a0 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
110b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
110c0 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
110d0 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
110e0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
110f0 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
11100 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
11110 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a  ){.    int j1, j
11120 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  2;.    j1 = sqli
11130 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11140 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72   OP_IfNot, regPr
11150 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71  ev);.    j2 = sq
11160 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
11170 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70  v, OP_Compare, p
11180 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
11190 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
111a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111c0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
111d0 20 70 34 74 79 70 65 29 3b 0a 20 20 20 20 73 71   p4type);.    sq
111e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
111f0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32  v, OP_Jump, j2+2
11200 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b  , iContinue, j2+
11210 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
11220 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
11230 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
11240 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11250 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74  Copy, pIn->iSdst
11260 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
11270 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20  ->nSdst-1);.    
11280 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11290 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
112a0 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
112b0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
112c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
112d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
112e0 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
112f0 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74  first OFFSET ent
11300 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73  ries if there is
11310 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
11320 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66  e.  */.  codeOff
11330 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69  set(v, p, iConti
11340 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  nue);..  switch(
11350 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b   pDest->eDest ){
11360 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
11370 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
11380 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
11390 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
113a0 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
113b0 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
113c0 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69  emTab: {.      i
113d0 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
113e0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
113f0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20  );.      int r2 
11400 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
11410 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
11420 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
11430 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54  st->eDest==SRT_T
11440 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
11450 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65  stcase( pDest->e
11460 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
11470 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
11480 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11490 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
114a0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
114b0 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20  >nSdst, r1);.   
114c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
114d0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
114e0 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  wid, pDest->iSDP
114f0 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
11500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11510 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
11520 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
11530 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  r1, r2);.      s
11540 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
11550 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
11560 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  END);.      sqli
11570 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
11580 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
11590 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
115a0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
115b0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
115c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
115d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
115e0 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
115f0 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
11600 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
11610 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
11620 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
11630 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
11640 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
11650 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
11660 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
11670 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
11680 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
11690 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
116a0 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
116b0 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
116c0 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
116d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
116e0 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20  ->nSdst==1 );.  
116f0 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64      pDest->affSd
11700 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73  st = .         s
11710 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
11720 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d  inity(p->pEList-
11730 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65  >a[0].pExpr, pDe
11740 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20  st->affSdst);.  
11750 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
11760 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
11770 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
11780 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11790 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
117a0 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31 2c  n->iSdst, 1, r1,
117b0 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74   &pDest->affSdst
117c0 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ,1);.      sqlit
117d0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
117e0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
117f0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29  , pIn->iSdst, 1)
11800 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11810 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11820 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74  IdxInsert, pDest
11830 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a  ->iSDParm, r1);.
11840 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
11850 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
11860 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
11870 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
11880 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63   0  /* Never occ
11890 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20  urs on an ORDER 
118a0 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  BY query */.    
118b0 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
118c0 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
118d0 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
118e0 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
118f0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
11900 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
11910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11920 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
11930 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74  nteger, 1, pDest
11940 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
11950 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
11960 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
11970 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
11980 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
11990 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
119a0 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  f..    /* If thi
119b0 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
119c0 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
119d0 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
119e0 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
119f0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
11a00 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
11a10 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
11a20 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
11a30 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
11a40 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
11a50 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
11a60 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
11a70 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29   pIn->nSdst==1 )
11a80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11a90 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
11aa0 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
11ab0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
11ac0 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
11ad0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
11ae0 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
11af0 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
11b00 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
11b10 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
11b20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11b30 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
11b40 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
11b50 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
11b60 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
11b70 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
11b80 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73  starting at pDes
11b90 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20  t->iSdst.  Then 
11ba0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
11bb0 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
11bc0 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
11bd0 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
11be0 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
11bf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
11c00 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69  st->iSdst = sqli
11c10 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
11c20 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64  pParse, pIn->nSd
11c30 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  st);.        pDe
11c40 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d  st->nSdst = pIn-
11c50 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a  >nSdst;.      }.
11c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11c70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
11c80 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
11c90 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  est->iSdst, pDes
11ca0 74 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  t->nSdst);.     
11cb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11cc0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
11cd0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
11ce0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11cf0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
11d00 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65  one of the above
11d10 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
11d20 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75  t destination mu
11d30 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54  st be.    ** SRT
11d40 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72  _Output.  This r
11d50 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
11d60 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20  called with any 
11d70 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73  other.    ** des
11d80 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74  tination other t
11d90 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e  han the ones han
11da0 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52  dled above or SR
11db0 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a  T_Output..    **
11dc0 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f  .    ** For SRT_
11dd0 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20  Output, results 
11de0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
11df0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
11e00 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20  sters.  .    ** 
11e10 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75  Then the OP_Resu
11e20 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20  ltRow opcode is 
11e30 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71  used to cause sq
11e40 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a  lite3_step() to.
11e50 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68      ** return th
11e60 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65  e next row of re
11e70 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sult..    */.   
11e80 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
11e90 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
11ea0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
11eb0 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ut );.      sqli
11ec0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11ed0 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
11ee0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
11ef0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
11f00 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
11f10 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
11f20 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
11f30 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
11f40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11f50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
11f60 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
11f70 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
11f80 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
11f90 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
11fa0 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
11fb0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11fc0 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
11fd0 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d  Limit, iBreak, -
11fe0 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  1);.  }..  /* Ge
11ff0 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
12000 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
12010 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
12020 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
12030 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
12040 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12050 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
12060 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
12070 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
12080 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
12090 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
120a0 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
120b0 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
120c0 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
120d0 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
120e0 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
120f0 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
12100 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
12110 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
12120 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
12130 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
12140 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
12150 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
12160 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
12170 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
12180 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
12190 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
121a0 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
121b0 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
121c0 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
121d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
121e0 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
121f0 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
12200 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
12210 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
12220 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
12230 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
12240 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
12250 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
12260 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
12270 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
12280 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
12290 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
122a0 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
122b0 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
122c0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
122d0 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
122e0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
122f0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
12300 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
12310 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
12320 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
12330 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
12340 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
12350 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
12360 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
12370 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
12380 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
12390 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
123a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
123b0 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
123c0 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
123d0 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
123e0 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
123f0 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
12400 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
12410 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
12420 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
12430 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
12440 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
12450 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
12460 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
12470 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
12480 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
12490 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
124a0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
124b0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
124c0 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
124d0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
124e0 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
124f0 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
12500 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
12510 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
12520 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
12530 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
12540 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
12550 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
12560 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
12570 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12580 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
12590 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
125a0 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
125b0 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
125c0 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
125d0 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
125e0 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
125f0 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
12600 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
12610 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
12620 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
12630 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
12640 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
12650 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
12660 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
12670 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
12680 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
12690 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
126a0 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
126b0 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
126c0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
126d0 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
126e0 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
126f0 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
12700 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
12710 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
12720 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
12730 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
12740 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
12750 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
12760 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
12770 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
12780 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
12790 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
127a0 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
127b0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
127c0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
127d0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
127e0 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
127f0 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
12800 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
12810 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
12820 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
12830 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
12840 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
12850 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
12860 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
12870 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
12880 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
12890 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
128a0 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
128b0 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
128c0 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
128d0 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
128e0 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
128f0 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
12900 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
12910 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
12920 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
12930 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
12940 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
12950 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
12960 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
12970 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
12980 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
12990 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
129a0 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
129b0 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
129c0 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
129d0 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
129e0 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
129f0 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
12a00 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
12a10 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
12a20 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
12a30 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
12a40 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
12a50 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
12a60 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
12a70 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
12a80 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
12a90 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
12aa0 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
12ab0 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
12ac0 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
12ad0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
12ae0 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
12af0 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
12b00 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
12b10 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
12b20 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
12b30 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
12b40 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
12b50 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
12b60 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
12b70 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
12b80 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
12b90 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
12ba0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
12bb0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
12bc0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
12bd0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
12be0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
12bf0 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
12c00 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
12c10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
12c20 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
12c30 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
12c40 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
12c50 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
12c60 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
12c70 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
12c80 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
12c90 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
12ca0 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
12cb0 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
12cc0 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
12cd0 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
12ce0 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
12cf0 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
12d00 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
12d10 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
12d20 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
12d30 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
12d40 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
12d50 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
12d60 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
12d70 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
12d80 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
12d90 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
12da0 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
12db0 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
12dc0 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
12dd0 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
12de0 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
12df0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
12e00 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
12e10 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
12e20 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
12e30 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12e40 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
12e50 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
12e60 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
12e70 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
12e80 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
12e90 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
12ea0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
12eb0 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
12ec0 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
12ed0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
12ee0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
12ef0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
12f00 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
12f10 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
12f20 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
12f30 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
12f40 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
12f50 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
12f60 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
12f70 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
12f80 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
12f90 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
12fa0 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
12fb0 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
12fc0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
12fd0 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
12fe0 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
12ff0 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
13000 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
13010 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
13020 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
13030 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
13040 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20 20 20  int regEofA;    
13050 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f        /* Flag to
13060 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73   indicate when s
13070 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c  elect-A is compl
13080 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ete */.  int reg
13090 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f  AddrB;         /
130a0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
130b0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20  er for select-B 
130c0 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
130d0 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20 20 20  nt regEofB;     
130e0 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20       /* Flag to 
130f0 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73 65  indicate when se
13100 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65  lect-B is comple
13110 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  te */.  int addr
13120 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a  SelectA;      /*
13130 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
13140 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
13150 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
13160 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a  SelectB;      /*
13170 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
13180 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69  select-B corouti
13190 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
131a0 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utA;          /*
131b0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
131c0 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
131d0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
131e0 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20  .  int regOutB; 
131f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
13200 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
13210 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
13220 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
13230 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20  t addrOutA;     
13240 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
13250 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  f the output-A s
13260 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
13270 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b  nt addrOutB = 0;
13280 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
13290 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  of the output-B 
132a0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
132b0 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20  int addrEofA;   
132c0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
132d0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
132e0 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
132f0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
13300 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20  ddrEofB;        
13310 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
13320 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61  he select-B-exha
13330 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
13340 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c   */.  int addrAl
13350 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
13360 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c  ddress of the A<
13370 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
13380 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20    int addrAeqB; 
13390 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
133a0 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73  ss of the A==B s
133b0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
133c0 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20  nt addrAgtB;    
133d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
133e0 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f  of the A>B subro
133f0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
13400 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20  egLimitA;       
13410 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
13420 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
13430 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
13440 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tB;        /* Li
13450 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
13460 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
13470 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
13480 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20       /* A range 
13490 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
134a0 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75  hold previous ou
134b0 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  tput */.  int sa
134c0 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  vedLimit;       
134d0 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
134e0 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  f p->iLimit */. 
134f0 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74   int savedOffset
13500 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  ;      /* Saved 
13510 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66  value of p->iOff
13520 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  set */.  int lab
13530 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f  elCmpr;        /
13540 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
13550 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72  start of the mer
13560 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  ge algorithm */.
13570 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20    int labelEnd; 
13580 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
13590 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
135a0 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45  the overall SELE
135b0 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  CT stmt */.  int
135c0 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   j1;            
135d0 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72     /* Jump instr
135e0 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74  uctions that get
135f0 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a   retargetted */.
13600 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
13610 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
13620 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49  f TK_ALL, TK_UNI
13630 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54  ON, TK_EXCEPT, T
13640 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20  K_INTERSECT */. 
13650 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75   KeyInfo *pKeyDu
13660 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72  p = 0; /* Compar
13670 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
13680 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72   for duplicate r
13690 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49  emoval */.  KeyI
136a0 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20  nfo *pKeyMerge; 
136b0 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
136c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
136d0 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  merging rows */.
136e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
136f0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
13700 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
13710 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
13720 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
13730 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
13740 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
13750 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
13760 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
13770 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
13780 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
13790 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20  aPermute;       
137a0 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
137b0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
137c0 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  to result set co
137d0 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66  lumns */.#ifndef
137e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
137f0 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31  LAIN.  int iSub1
13800 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
13810 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68  EQP id of left-h
13820 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  and query */.  i
13830 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20  nt iSub2;       
13840 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
13850 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65  f right-hand que
13860 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ry */.#endif..  
13870 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
13880 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
13890 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
138a0 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
138b0 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
138c0 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
138d0 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
138e0 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
138f0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
13900 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
13910 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
13920 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
13930 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
13940 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
13950 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
13960 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
13970 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
13980 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
13990 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
139a0 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
139b0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
139c0 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
139d0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
139e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
139f0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
13a00 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
13a10 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61  p->pOrderBy;.  a
13a20 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
13a30 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
13a40 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
13a50 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61  ..  /* For opera
13a60 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  tors other than 
13a70 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76  UNION ALL we hav
13a80 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
13a90 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44  hat.  ** the ORD
13aa0 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76  ER BY clause cov
13ab0 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f  ers every term o
13ac0 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
13ad0 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d  .  Add.  ** term
13ae0 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
13af0 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65  Y clause as nece
13b00 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
13b10 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op!=TK_ALL ){.
13b20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d      for(i=1; db-
13b30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
13b40 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74   && i<=p->pEList
13b50 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
13b60 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
13b70 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
13b80 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
13b90 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
13ba0 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; j<nOrderBy; 
13bb0 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
13bc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13bd0 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f  Item->iOrderByCo
13be0 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
13bf0 66 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72  f( pItem->iOrder
13c00 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  ByCol==i ) break
13c10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13c20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
13c30 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
13c40 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
13c50 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
13c60 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
13c70 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
13c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13c90 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
13ca0 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
13cb0 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
13cc0 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
13cd0 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  i;.        pOrde
13ce0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
13cf0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
13d00 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
13d10 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
13d20 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
13d30 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
13d40 2b 2b 5d 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  ++].iOrderByCol 
13d50 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20  = (u16)i;.      
13d60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
13d70 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
13d80 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61  mparison permuta
13d90 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f  tion and keyinfo
13da0 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69   that is used wi
13db0 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d  th.  ** the perm
13dc0 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  utation used to 
13dd0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
13de0 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f   next.  ** row o
13df0 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20  f results comes 
13e00 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20  from selectA or 
13e10 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61  selectB.  Also a
13e20 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a  dd explicit.  **
13e30 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74   collations to t
13e40 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
13e50 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74  se terms so that
13e60 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   when the subque
13e70 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ries.  ** to the
13e80 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c   right and the l
13e90 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  eft are evaluate
13ea0 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20  d, they use the 
13eb0 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c  correct.  ** col
13ec0 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  lation..  */.  a
13ed0 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65  Permute = sqlite
13ee0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
13ef0 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72   sizeof(int)*nOr
13f00 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50  derBy);.  if( aP
13f10 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74  ermute ){.    st
13f20 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
13f30 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66  em *pItem;.    f
13f40 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(i=0, pItem=pO
13f50 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72  rderBy->a; i<nOr
13f60 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65  derBy; i++, pIte
13f70 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  m++){.      asse
13f80 72 74 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65  rt( pItem->iOrde
13f90 72 42 79 43 6f 6c 3e 30 20 20 26 26 20 70 49 74  rByCol>0  && pIt
13fa0 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3c  em->iOrderByCol<
13fb0 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
13fc0 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d  r );.      aPerm
13fd0 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  ute[i] = pItem->
13fe0 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b  iOrderByCol - 1;
13ff0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
14000 65 72 67 65 20 3d 0a 20 20 20 20 20 20 73 71 6c  erge =.      sql
14010 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
14020 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79  db, sizeof(*pKey
14030 4d 65 72 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a  Merge)+nOrderBy*
14040 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
14050 29 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70  )+1));.    if( p
14060 4b 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  KeyMerge ){.    
14070 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f    pKeyMerge->aSo
14080 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
14090 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c  pKeyMerge->aColl
140a0 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20  [nOrderBy];.    
140b0 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69    pKeyMerge->nFi
140c0 65 6c 64 20 3d 20 28 75 31 36 29 6e 4f 72 64 65  eld = (u16)nOrde
140d0 72 42 79 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d  rBy;.      pKeyM
140e0 65 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  erge->enc = ENC(
140f0 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  db);.      for(i
14100 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
14110 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  i++){.        Co
14120 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
14130 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
14140 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  m = pOrderBy->a[
14150 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
14160 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
14170 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
14180 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
14190 70 43 6f 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  pColl = pTerm->p
141a0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  Coll;.        }e
141b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
141c0 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
141d0 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
141e0 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b 69 5d  , p, aPermute[i]
141f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  );.          pTe
14200 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  rm->flags |= EP_
14210 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ExpCollate;.    
14220 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 43 6f        pTerm->pCo
14230 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  ll = pColl;.    
14240 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4b      }.        pK
14250 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69  eyMerge->aColl[i
14260 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
14270 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53     pKeyMerge->aS
14280 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f  ortOrder[i] = pO
14290 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
142a0 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a  tOrder;.      }.
142b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
142c0 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30     pKeyMerge = 0
142d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74  ;.  }..  /* Reat
142e0 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
142f0 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  Y clause to the 
14300 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d  query..  */.  p-
14310 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
14320 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  erBy;.  pPrior->
14330 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
14340 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50  e3ExprListDup(pP
14350 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72  arse->db, pOrder
14360 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c  By, 0);..  /* Al
14370 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f  locate a range o
14380 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  f temporary regi
14390 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65  sters and the Ke
143a0 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a  yInfo needed.  *
143b0 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20  * for the logic 
143c0 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70  that removes dup
143d0 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f  licate result ro
143e0 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ws when the.  **
143f0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
14400 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
14410 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f  NTERSECT (but no
14420 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20  t UNION ALL)..  
14430 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
14440 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72  ALL ){.    regPr
14450 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ev = 0;.  }else{
14460 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
14470 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
14480 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  r;.    assert( n
14490 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c  OrderBy>=nExpr |
144a0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
144b0 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65  ed );.    regPre
144c0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  v = sqlite3GetTe
144d0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
144e0 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 73 71  nExpr+1);.    sq
144f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14500 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
14510 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
14520 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65  pKeyDup = sqlite
14530 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
14540 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14550 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79      sizeof(*pKey
14560 44 75 70 29 20 2b 20 6e 45 78 70 72 2a 28 73 69  Dup) + nExpr*(si
14570 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
14580 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  ) );.    if( pKe
14590 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 70 4b  yDup ){.      pK
145a0 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
145b0 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 44 75  r = (u8*)&pKeyDu
145c0 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  p->aColl[nExpr];
145d0 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e  .      pKeyDup->
145e0 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 45  nField = (u16)nE
145f0 78 70 72 3b 0a 20 20 20 20 20 20 70 4b 65 79 44  xpr;.      pKeyD
14600 75 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  up->enc = ENC(db
14610 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
14620 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ; i<nExpr; i++){
14630 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
14640 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c  ->aColl[i] = mul
14650 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
14660 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
14670 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
14680 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
14690 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
146a0 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61  .  }. .  /* Sepa
146b0 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e  rate the left an
146c0 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72  d the right quer
146d0 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68  y from one anoth
146e0 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  er.  */.  p->pPr
146f0 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ior = 0;.  sqlit
14700 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
14710 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
14720 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
14730 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
14740 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
14750 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
14760 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
14770 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
14780 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
14790 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
147a0 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
147b0 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
147c0 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
147d0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
147e0 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
147f0 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
14800 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
14810 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
14820 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
14830 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
14840 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
14850 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
14860 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14870 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
14880 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
14890 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
148d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
148e0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
148f0 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
14900 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
14910 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
14920 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
14930 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
14940 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
14950 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
14960 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
14970 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
14980 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d  ->pOffset);.  p-
14990 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >pOffset = 0;.. 
149a0 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
149b0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
149c0 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65  gEofA = ++pParse
149d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
149e0 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
149f0 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d  Mem;.  regEofB =
14a00 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
14a10 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70  .  regOutA = ++p
14a20 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
14a30 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73  egOutB = ++pPars
14a40 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
14a50 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
14a60 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72  (&destA, SRT_Cor
14a70 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
14a80 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
14a90 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
14aa0 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  B, SRT_Coroutine
14ab0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
14ac0 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65  /* Jump past the
14ad0 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74   various subrout
14ae0 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69  ines and corouti
14af0 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a  nes to the main.
14b00 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a    ** merge loop.
14b10 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69    */.  j1 = sqli
14b20 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
14b30 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64   OP_Goto);.  add
14b40 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74  rSelectA = sqlit
14b50 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
14b60 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e  r(v);...  /* Gen
14b70 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
14b80 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
14b90 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
14ba0 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c  nt to the.  ** l
14bb0 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  eft of the compo
14bc0 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74  und operator - t
14bd0 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20  he "A" select.. 
14be0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
14bf0 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
14c00 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
14c10 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
14c20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
14c30 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65  = regLimitA;.  e
14c40 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14c50 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
14c60 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14c70 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
14c80 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
14c90 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74  &destA);.  sqlit
14ca0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14cb0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
14cc0 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74  egEofA);.  sqlit
14cd0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
14ce0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
14cf0 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  rA);.  VdbeNoopC
14d00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
14d10 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
14d20 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20  ft SELECT"));.. 
14d30 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
14d40 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
14d50 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
14d60 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20  statement on .  
14d70 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74  ** the right - t
14d80 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20  he "B" select.  
14d90 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42  */.  addrSelectB
14da0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
14db0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
14dc0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
14dd0 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75  (v, "Begin corou
14de0 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53  tine for right S
14df0 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65  ELECT"));.  save
14e00 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  dLimit = p->iLim
14e10 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65  it;.  savedOffse
14e20 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
14e30 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65    p->iLimit = re
14e40 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f  gLimitB;.  p->iO
14e50 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65  ffset = 0;  .  e
14e60 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14e70 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
14e80 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14e90 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
14ea0 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
14eb0 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  B);.  p->iLimit 
14ec0 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20  = savedLimit;.  
14ed0 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76  p->iOffset = sav
14ee0 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69  edOffset;.  sqli
14ef0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14f00 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
14f10 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69  regEofB);.  sqli
14f20 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14f30 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
14f40 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  drB);.  VdbeNoop
14f50 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
14f60 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
14f70 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
14f80 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
14f90 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
14fa0 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
14fb0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
14fc0 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  A.  ** select as
14fd0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
14fe0 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
14ff0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
15000 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
15010 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
15020 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29  routine for A"))
15030 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67  ;.  addrOutA = g
15040 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
15050 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15070 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73   p, &destA, pDes
15080 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20  t, regOutA,.    
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
150a0 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50  Prev, pKeyDup, P
150b0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
150c0 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  F, labelEnd);.  
150d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
150e0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
150f0 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
15100 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
15110 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  B.  ** select as
15120 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
15130 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
15140 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
15150 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
15160 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
15170 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f  ON ){.    VdbeNo
15180 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
15190 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
151a0 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72  r B"));.    addr
151b0 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutB = generateO
151c0 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
151d0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
151e0 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
151f0 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tB, pDest, regOu
15200 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tB,.            
15210 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
15220 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46  eyDup, P4_KEYINF
15230 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62 65 6c 45  O_STATIC, labelE
15240 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  nd);.  }..  /* G
15250 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
15260 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
15270 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
15280 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20  m select A.  ** 
15290 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
152a0 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
152b0 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e  elect B remains.
152c0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
152d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
152e0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -A subroutine"))
152f0 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  ;.  if( op==TK_E
15300 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
15310 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
15320 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
15330 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15340 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
15350 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  elEnd);.  }else{
15360 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20    .    addrEofA 
15370 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15380 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
15390 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29  gEofB, labelEnd)
153a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
153b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
153c0 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
153d0 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71 6c  drOutB);.    sql
153e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
153f0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
15400 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrB);.    sqlit
15410 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15420 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
15430 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53  EofA);.    p->nS
15440 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
15450 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
15460 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
15470 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
15480 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
15490 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
154a0 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
154b0 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
154c0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
154d0 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
154e0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
154f0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
15500 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
15510 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  fA;.    if( p->n
15520 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69  SelectRow > pPri
15530 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
15540 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
15550 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
15560 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  Row;.  }else{  .
15570 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
15580 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
15590 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
155a0 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
155b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
155c0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
155d0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
155e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
155f0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
15600 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
15610 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
15620 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15630 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
15640 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15650 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
15660 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29  to, 0, addrEofB)
15670 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
15680 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
15690 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
156a0 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
156b0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
156c0 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
156d0 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
156e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
156f0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
15700 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
15710 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
15720 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15730 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
15740 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15750 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
15760 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
15770 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
15780 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
15790 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
157a0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
157b0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
157c0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d   the case of A==
157d0 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  B.  */.  if( op=
157e0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61  =TK_ALL ){.    a
157f0 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
15800 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  tB;.  }else if( 
15810 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
15820 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
15830 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20   = addrAltB;.   
15840 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d   addrAltB++;.  }
15850 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f  else{.    VdbeNo
15860 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
15870 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -eq-B subroutine
15880 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71  "));.    addrAeq
15890 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B =.    sqlite3V
158a0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
158b0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
158c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
158d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
158e0 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
158f0 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ofA);.    sqlite
15900 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15910 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
15920 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
15930 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
15940 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
15950 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
15960 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
15970 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
15980 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
15990 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
159a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
159b0 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
159c0 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
159d0 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
159e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
159f0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
15a00 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
15a10 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
15a20 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
15a30 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
15a40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15a50 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
15a60 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  ofB, addrEofB);.
15a70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15a80 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
15a90 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
15aa0 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
15ab0 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
15ac0 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
15ad0 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
15ae0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
15af0 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   j1);.  sqlite3V
15b00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15b10 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
15b20 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
15b30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15b40 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
15b50 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
15b60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15b70 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41 2c  Gosub, regAddrA,
15b80 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
15b90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15ba0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
15bb0 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 53 65  regAddrB, addrSe
15bc0 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74 65  lectB);.  sqlite
15bd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15be0 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61  P_If, regEofA, a
15bf0 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  ddrEofA);.  sqli
15c00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15c10 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
15c20 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f   addrEofB);..  /
15c30 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
15c40 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
15c50 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
15c60 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
15c70 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
15c80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15c90 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
15ca0 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
15cb0 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
15cc0 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
15cd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
15ce0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
15cf0 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73  destA.iSdst, des
15d00 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72  tB.iSdst, nOrder
15d10 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
15d30 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
15d40 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
15d50 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  F);.  sqlite3Vdb
15d60 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
15d70 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
15d80 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
15d90 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
15da0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
15db0 74 65 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ters.  */.  if( 
15dc0 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 73  regPrev ){.    s
15dd0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15de0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
15df0 65 67 50 72 65 76 2c 20 6e 4f 72 64 65 72 42 79  egPrev, nOrderBy
15e00 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  +1);.  }..  /* J
15e10 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20  ump to the this 
15e20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
15e30 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
15e40 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  query..  */.  sq
15e50 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
15e60 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e  Label(v, labelEn
15e70 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  d);..  /* Set th
15e80 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
15e90 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ut columns.  */.
15ea0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
15eb0 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
15ec0 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46  {.    Select *pF
15ed0 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20  irst = pPrior;. 
15ee0 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
15ef0 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
15f00 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
15f10 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65  or;.    generate
15f20 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
15f30 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
15f40 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  EList);.  }..  /
15f50 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
15f60 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
15f70 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
15f80 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
15f90 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
15fa0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
15fb0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
15fc0 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
15fd0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
15fe0 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
15ff0 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
16000 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20  pPrior;..  /*** 
16010 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62  TBD:  Insert sub
16020 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f  routine calls to
16030 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f   close cursors o
16040 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a  n incomplete.  *
16050 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a  *** subqueries *
16060 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f  ***/.  explainCo
16070 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20  mposite(pParse, 
16080 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53  p->op, iSub1, iS
16090 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  ub2, 0);.  retur
160a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
160b0 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
160c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
160d0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
160e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
160f0 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61  T_VIEW)./* Forwa
16100 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd Declarations 
16110 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
16120 75 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c  ubstExprList(sql
16130 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a  ite3*, ExprList*
16140 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a  , int, ExprList*
16150 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  );.static void s
16160 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74  ubstSelect(sqlit
16170 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69  e3*, Select *, i
16180 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b  nt, ExprList *);
16190 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  ../*.** Scan thr
161a0 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
161b0 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
161c0 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
161d0 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
161e0 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
161f0 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
16200 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
16210 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79  lumn-th.** entry
16220 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
16230 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
16240 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
16250 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
16260 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  nged.).**.** Thi
16270 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
16280 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e  t of the flatten
16290 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ing procedure.  
162a0 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68  A subquery.** wh
162b0 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ose result set i
162c0 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c  s defined by pEL
162d0 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65  ist appears as e
162e0 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ntry in the.** F
162f0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
16300 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74  SELECT such that
16310 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
16320 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61   assigned to tha
16330 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65  t.** FORM clause
16340 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65   entry is iTable
16350 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
16360 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61  make the necessa
16370 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
16380 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
16390 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
163a0 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
163b0 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
163c0 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
163d0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
163e0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
163f0 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
16400 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71  *substExpr(.  sq
16410 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
16420 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
16430 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69  oc errors to thi
16440 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  s connection */.
16450 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
16460 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e        /* Expr in
16470 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74   which substitut
16480 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20  ion occurs */.  
16490 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
164a0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
164b0 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
164c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
164d0 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74  List    /* Subst
164e0 69 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e  itute expression
164f0 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  s */.){.  if( pE
16500 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
16510 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
16520 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
16530 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
16540 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66  iTable ){.    if
16550 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
16560 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  <0 ){.      pExp
16570 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
16580 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16590 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
165a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
165b0 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  st!=0 && pExpr->
165c0 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e  iColumn<pEList->
165d0 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
165e0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
165f0 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
16600 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
16610 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
16620 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
16630 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69  List->a[pExpr->i
16640 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30  Column].pExpr, 0
16650 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
16660 77 20 26 26 20 70 45 78 70 72 2d 3e 70 43 6f 6c  w && pExpr->pCol
16670 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  l ){.        pNe
16680 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72  w->pColl = pExpr
16690 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  ->pColl;.      }
166a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
166b0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
166c0 70 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  pr);.      pExpr
166d0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20   = pNew;.    }. 
166e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70   }else{.    pExp
166f0 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74  r->pLeft = subst
16700 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
16710 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
16720 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70  EList);.    pExp
16730 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73  r->pRight = subs
16740 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
16750 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
16760 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66   pEList);.    if
16770 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
16780 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
16790 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
167a0 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
167b0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
167c0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
167d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
167e0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
167f0 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70  t(db, pExpr->x.p
16800 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
16810 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
16820 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
16830 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
16840 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
16850 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
16860 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
16870 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
16880 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
16890 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
168a0 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
168b0 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
168c0 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
168d0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
168e0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
168f0 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
16900 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
16910 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
16920 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
16930 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
16940 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
16950 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
16960 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
16970 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c  pr; i++){.    pL
16980 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20  ist->a[i].pExpr 
16990 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
169a0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
169b0 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
169c0 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
169d0 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
169e0 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
169f0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  ,         /* Rep
16a00 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
16a10 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
16a20 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
16a30 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
16a40 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
16a50 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
16a60 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ons */.  int iTa
16a70 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
16a80 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70   Table to be rep
16a90 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  laced */.  ExprL
16aa0 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
16ab0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
16ac0 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  lues */.){.  Src
16ad0 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74  List *pSrc;.  st
16ae0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
16af0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
16b00 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  i;.  if( !p ) re
16b10 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70  turn;.  substExp
16b20 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c  rList(db, p->pEL
16b30 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ist, iTable, pEL
16b40 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
16b50 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72  rList(db, p->pGr
16b60 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  oupBy, iTable, p
16b70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
16b80 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
16b90 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c  OrderBy, iTable,
16ba0 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70   pEList);.  p->p
16bb0 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78  Having = substEx
16bc0 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  pr(db, p->pHavin
16bd0 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  g, iTable, pELis
16be0 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  t);.  p->pWhere 
16bf0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
16c00 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c  p->pWhere, iTabl
16c10 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
16c20 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d  bstSelect(db, p-
16c30 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c  >pPrior, iTable,
16c40 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63   pEList);.  pSrc
16c50 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
16c60 73 65 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f  sert( pSrc );  /
16c70 2a 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45  * Even for (SELE
16c80 43 54 20 31 29 20 77 65 20 68 61 76 65 3a 20 70  CT 1) we have: p
16c90 53 72 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d  Src!=0 but pSrc-
16ca0 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66  >nSrc==0 */.  if
16cb0 28 20 41 4c 57 41 59 53 28 70 53 72 63 29 20 29  ( ALWAYS(pSrc) )
16cc0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63  {.    for(i=pSrc
16cd0 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53  ->nSrc, pItem=pS
16ce0 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  rc->a; i>0; i--,
16cf0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
16d00 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
16d10 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
16d20 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16d30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
16d40 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
16d50 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
16d60 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
16d70 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
16d80 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
16d90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
16da0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
16db0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
16dc0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
16dd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
16de0 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
16df0 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61   subqueries as a
16e00 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
16e10 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  imization..** Th
16e20 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
16e30 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
16e40 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
16e50 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20  f no flattening 
16e60 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
16e70 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
16e80 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
16e90 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
16ea0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
16eb0 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
16ec0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
16ed0 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
16ee0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
16ef0 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
16f00 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
16f10 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
16f20 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
16f30 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
16f40 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
16f50 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
16f60 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
16f70 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
16f80 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
16f90 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
16fa0 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
16fb0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
16fc0 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
16fd0 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
16fe0 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
16ff0 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
17000 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
17010 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
17020 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
17030 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
17040 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
17050 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
17060 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
17070 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
17080 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
17090 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
170a0 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
170b0 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
170c0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
170d0 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
170e0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
170f0 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
17100 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
17110 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
17120 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73  pification gives
17130 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
17140 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73  .** but only has
17150 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74   to scan the dat
17160 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63  a once.  And bec
17170 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67  ause indices mig
17180 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20  ht .** exist on 
17190 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20  the table t1, a 
171a0 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66  complete scan of
171b0 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   the data might 
171c0 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a  be.** avoided..*
171d0 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20  *.** Flattening 
171e0 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65  is only attempte
171f0 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  d if all of the 
17200 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
17210 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
17220 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
17230 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
17240 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
17250 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  e aggregates..**
17260 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 73  .**   (2)  The s
17270 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
17280 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
17290 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
172a0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
172b0 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20 73  .**   (3)  The s
172c0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74  ubquery is not t
172d0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
172e0 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
172f0 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20   join.**        
17300 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b  (Originally tick
17310 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67  et #306.  Streng
17320 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74  thened by ticket
17330 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20   #3300).**.**   
17340 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (4)  The subquer
17350 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
17360 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  T..**.**  (**)  
17370 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73  At one point res
17380 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e  trictions (4) an
17390 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20  d (5) defined a 
173a0 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e  subset of DISTIN
173b0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  CT.**        sub
173c0 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65  -queries that we
173d0 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
173e0 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
173f0 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20  on. Restriction 
17400 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68  .**        (4) h
17410 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78  as since been ex
17420 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64  panded to exclud
17430 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73  e all DISTINCT s
17440 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  ubqueries..**.**
17450 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71     (6)  The subq
17460 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
17470 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
17480 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17490 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  is not.**       
174a0 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
174b0 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71     (7)  The subq
174c0 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20  uery has a FROM 
174d0 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20  clause.  TODO:  
174e0 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77  For subqueries w
174f0 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20  ithout.**       
17500 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20   A FROM clause, 
17510 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  consider adding 
17520 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74  a FROM close wit
17530 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  h the special.**
17540 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71          table sq
17550 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63  lite_once that c
17560 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e  onsists of a sin
17570 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
17580 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73  ng a.**        s
17590 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ingle NULL..**.*
175a0 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
175b0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
175c0 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
175d0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
175e0 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
175f0 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
17600 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
17610 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
17620 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
17630 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
17640 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
17650 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73  .**  (10)  The s
17660 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
17670 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
17680 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
17690 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
176a0 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e        use LIMIT.
176b0 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
176c0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
176d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
176e0 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
176f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
17700 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e  ..**.**  (**)  N
17710 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20  ot implemented. 
17720 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72   Subsumed into r
17730 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20  estriction (3). 
17740 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a   Was previously.
17750 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61  **        a sepa
17760 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e  rate restriction
17770 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74   deriving from t
17780 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a  icket #350..**.*
17790 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62  *  (13)  The sub
177a0 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20  query and outer 
177b0 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
177c0 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a  h use LIMIT..**.
177d0 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75  **  (14)  The su
177e0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
177f0 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  use OFFSET..**.*
17800 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74  *  (15)  The out
17810 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
17820 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
17830 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65  nd select or the
17840 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
17850 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ery does not hav
17860 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
17870 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
17880 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e   ticket #2339 an
17890 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38  d ticket [02a8e8
178a0 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  1d44])..**.**  (
178b0 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  16)  The outer q
178c0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
178d0 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
178e0 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a  subquery does.**
178f0 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74          not cont
17900 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28  ain ORDER BY.  (
17910 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54  Ticket #2942)  T
17920 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20  his used to not 
17930 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  matter.**       
17940 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64   until we introd
17950 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63  uced the group_c
17960 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e  oncat() function
17970 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20  .  .**.**  (17) 
17980 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   The sub-query i
17990 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  s not a compound
179a0 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69   select, or it i
179b0 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a  s a UNION ALL .*
179c0 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e  *        compoun
179d0 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70  d clause made up
179e0 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e   entirely of non
179f0 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
17a00 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  es, and .**     
17a10 20 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75     the parent qu
17a20 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ery:.**.**      
17a30 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73      * is not its
17a40 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f  elf part of a co
17a50 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a  mpound select,.*
17a60 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
17a70 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
17a80 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65   or DISTINCT que
17a90 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ry, and.**      
17aa0 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a      * is not a j
17ab0 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  oin.**.**       
17ac0 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20   The parent and 
17ad0 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f  sub-query may co
17ae0 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ntain WHERE clau
17af0 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a  ses. Subject to.
17b00 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20  **        rules 
17b10 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28  (11), (13) and (
17b20 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c  14), they may al
17b30 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  so contain ORDER
17b40 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c   BY,.**        L
17b50 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
17b60 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75  clauses.  The su
17b70 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73  bquery cannot us
17b80 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a  e any compound.*
17b90 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
17ba0 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  r other than UNI
17bb0 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61  ON ALL because a
17bc0 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d  ll the other com
17bd0 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
17be0 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61  operators have a
17bf0 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e  n implied DISTIN
17c00 43 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61  CT which is disa
17c10 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20  llowed by.**    
17c20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20      restriction 
17c30 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  (4)..**.**      
17c40 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d    Also, each com
17c50 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75  ponent of the su
17c60 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65 74  b-query must ret
17c70 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  urn the same num
17c80 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66  ber.**        of
17c90 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e   result columns.
17ca0 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c   This is actuall
17cb0 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20  y a requirement 
17cc0 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64  for any compound
17cd0 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43  .**        SELEC
17ce0 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74  T statement, but
17cf0 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65   all the code he
17d00 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  re does is make 
17d10 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20  sure that no.** 
17d20 20 20 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c         such (ill
17d30 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20  egal) sub-query 
17d40 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68  is flattened. Th
17d50 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65  e caller will de
17d60 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20  tect the.**     
17d70 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20     syntax error 
17d80 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 74  and return a det
17d90 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a  ailed message..*
17da0 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74  *.**  (18)  If t
17db0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
17dc0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
17dd0 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d  t, then all term
17de0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20  s of the.**     
17df0 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75     ORDER by clau
17e00 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  se of the parent
17e10 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20   must be simple 
17e20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a  references to .*
17e30 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73  *        columns
17e40 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
17e50 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20  y..**.**  (19)  
17e60 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
17e70 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
17e80 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
17e90 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
17ea0 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45        have a WHE
17eb0 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  RE clause..**.**
17ec0 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73    (20)  If the s
17ed0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
17ee0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
17ef0 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20  hen it must not 
17f00 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e  use.**        an
17f10 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
17f20 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e  .  Ticket #3773.
17f30 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78    We could relax
17f40 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
17f50 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77  .**        somew
17f60 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68  hat by saying th
17f70 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  at the terms of 
17f80 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
17f90 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20  use must.**     
17fa0 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d     appear as unm
17fb0 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63  odified result c
17fc0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75  olumns in the ou
17fd0 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20  ter query.  But 
17fe0 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  we.**        hav
17ff0 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61  e other optimiza
18000 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f  tions in mind to
18010 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20   deal with that 
18020 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31  case..**.**  (21
18030 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
18040 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
18050 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
18060 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
18070 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
18080 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37    (See ticket [7
18090 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a  52e1646fc])..**.
180a0 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
180b0 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
180c0 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
180d0 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
180e0 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
180f0 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
18100 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
18110 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
18120 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
18130 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
18140 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
18150 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
18160 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
18170 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
18180 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
18190 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
181a0 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
181b0 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
181c0 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
181d0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
181e0 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
181f0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
18200 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
18210 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
18220 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
18230 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
18240 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
18250 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
18260 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
18270 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
18280 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
18290 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
182a0 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
182b0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
182c0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
182d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
182e0 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
182f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
18300 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
18310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
18320 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
18330 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
18340 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
18350 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
18360 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
18370 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
18380 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
18390 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
183a0 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
183b0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
183c0 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
183d0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
183e0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
183f0 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
18400 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
18410 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
18420 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
18430 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
18440 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
18450 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
18460 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
18470 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
18480 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
18490 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
184a0 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
184b0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
184c0 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
184d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
184e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
184f0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
18500 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
18510 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
18520 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
18530 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
18540 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
18550 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
18560 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
18570 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
18580 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
18590 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
185a0 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
185b0 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
185c0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
185d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
185e0 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
185f0 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
18600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18610 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
18620 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
18630 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
18640 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
18650 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
18660 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
18670 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
18680 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
18690 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
186a0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
186b0 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
186c0 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
186d0 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
186e0 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20  0 );  /* Unable 
186f0 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f  to flatten compo
18700 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  und queries */. 
18710 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
18720 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
18730 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
18740 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ner) ) return 0;
18750 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
18760 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
18770 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
18780 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
18790 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
187a0 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
187b0 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  ];.  iParent = p
187c0 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
187d0 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
187e0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
187f0 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
18800 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
18810 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
18820 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
18830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18840 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20  estriction (1)  
18850 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72  */.  if( subquer
18860 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e  yIsAgg && pSrc->
18870 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
18880 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  0;          /* R
18890 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20  estriction (2)  
188a0 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  */.  pSubSrc = p
188b0 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
188c0 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
188d0 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
188e0 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
188f0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
18900 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
18910 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
18920 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
18930 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20  y expresssions, 
18940 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20  we allowed some 
18950 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d  combining of LIM
18960 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
18970 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20  ** because they 
18980 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  could be compute
18990 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
189a0 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d  e.  But when LIM
189b0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
189c0 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72  ** became arbitr
189d0 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
189e0 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20   we were forced 
189f0 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69  to add restricti
18a00 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e  ons (13).  ** an
18a10 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28  d (14). */.  if(
18a20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
18a30 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
18a40 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
18a50 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18a60 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28  on (13) */.  if(
18a70 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29   pSub->pOffset )
18a80 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18aa0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18ab0 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28  on (14) */.  if(
18ac0 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26   p->pRightmost &
18ad0 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
18ae0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18b20 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
18b30 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
18b40 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
18b50 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
18b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18b70 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
18b80 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
18b90 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
18ba0 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
18bb0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
18bc0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35  * Restriction (5
18bd0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
18be0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
18bf0 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
18c00 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
18c10 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
18c20 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
18c30 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
18c40 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
18c50 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
18c60 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
18c70 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  g ){.     return
18c80 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
18c90 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20  estriction (6)  
18ca0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
18cb0 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
18cc0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
18cd0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d00 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
18d10 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20  ction (11) */.  
18d20 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  }.  if( isAgg &&
18d30 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
18d40 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
18d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18d60 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a  striction (16) *
18d70 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
18d80 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72  imit && p->pWher
18d90 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
18da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18db0 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a  striction (19) *
18dc0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
18dd0 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  imit && (p->selF
18de0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
18df0 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  ct)!=0 ){.     r
18e00 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
18e10 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
18e20 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  (21) */.  }..  /
18e30 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
18e40 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 1:.  ** Restr
18e50 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68  iction 3:  If th
18e60 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20  e subquery is a 
18e70 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
18e80 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
18e90 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61  .  ** not used a
18ea0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
18eb0 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20  and of an outer 
18ec0 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20  join.  Examples 
18ed0 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a  of why this.  **
18ee0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
18ef0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
18f00 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
18f10 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
18f20 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
18f30 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
18f40 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
18f50 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
18f60 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
18f70 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
18f80 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
18f90 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
18fa0 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
18fb0 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53  g..  **.  ** OBS
18fc0 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a  OLETE COMMENT 2:
18fd0 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
18fe0 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75  n 12:  If the su
18ff0 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
19000 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
19010 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a   left outer.  **
19020 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
19030 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
19040 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
19050 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70  e..  ** An examp
19060 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20  les of why this 
19070 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
19080 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
19090 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
190a0 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  JOIN (SELECT * F
190b0 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e  ROM t2 WHERE t2.
190c0 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  x>0).  **.  ** I
190d0 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
190e0 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
190f0 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
19100 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
19110 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57  OUTER JOIN t2) W
19120 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a  HERE t2.x>0.  **
19130 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32  .  ** But the t2
19140 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61  .x>0 test will a
19150 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20  lways fail on a 
19160 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20  NULL row of t2, 
19170 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63  which.  ** effec
19180 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20  tively converts 
19190 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69  the OUTER JOIN i
191a0 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49  nto an INNER JOI
191b0 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49  N..  **.  ** THI
191c0 53 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f  S OVERRIDES OBSO
191d0 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20  LETE COMMENTS 1 
191e0 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a  AND 2 ABOVE:.  *
191f0 2a 20 54 69 63 6b 65 74 20 23 33 33 30 30 20 73  * Ticket #3300 s
19200 68 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74 65  hows that flatte
19210 6e 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 74  ning the right t
19220 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
19230 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67  IN.  ** is fraug
19240 68 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20  ht with danger. 
19250 20 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74   Best to avoid t
19260 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20  he whole thing. 
19270 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62   If the.  ** sub
19280 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
19290 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
192a0 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20  T JOIN, then do 
192b0 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a  not flatten..  *
192c0 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65  /.  if( (pSubite
192d0 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
192e0 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
192f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
19300 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
19310 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62  n 17: If the sub
19320 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
19330 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65  ound SELECT, the
19340 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75  n it must.  ** u
19350 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f  se only the UNIO
19360 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20  N ALL operator. 
19370 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  And none of the 
19380 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75  simple select qu
19390 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  eries.  ** that 
193a0 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70  make up the comp
193b0 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20  ound SELECT are 
193c0 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67  allowed to be ag
193d0 67 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69  gregate or disti
193e0 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  nct.  ** queries
193f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
19400 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  b->pPrior ){.   
19410 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
19420 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rBy ){.      ret
19430 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72  urn 0;  /* Restr
19440 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20  iction 20 */.   
19450 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67   }.    if( isAgg
19460 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   || (p->selFlags
19470 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
19480 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63  =0 || pSrc->nSrc
19490 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
194a0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
194b0 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b   for(pSub1=pSub;
194c0 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53   pSub1; pSub1=pS
194d0 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  ub1->pPrior){.  
194e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
194f0 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
19500 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
19510 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
19520 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
19530 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
19540 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
19550 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
19560 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
19570 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
19580 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
19590 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20  >pSrc!=0 );.    
195a0 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65    if( (pSub1->se
195b0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
195c0 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
195d0 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c  te))!=0.       |
195e0 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  | (pSub1->pPrior
195f0 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54   && pSub1->op!=T
19600 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c  K_ALL) .       |
19610 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  | pSub1->pSrc->n
19620 53 72 63 3c 31 0a 20 20 20 20 20 20 20 7c 7c 20  Src<1.       || 
19630 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
19640 78 70 72 21 3d 70 53 75 62 31 2d 3e 70 45 4c 69  xpr!=pSub1->pELi
19650 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  st->nExpr.      
19660 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
19670 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
19680 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75     testcase( pSu
19690 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31  b1->pSrc->nSrc>1
196a0 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
196b0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38  * Restriction 18
196c0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
196d0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
196e0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
196f0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
19700 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
19710 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
19720 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  if( p->pOrderBy-
19730 3e 61 5b 69 69 5d 2e 69 4f 72 64 65 72 42 79 43  >a[ii].iOrderByC
19740 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ol==0 ) return 0
19750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19760 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66    }..  /***** If
19770 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
19780 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67  oint, flattening
19790 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
197a0 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68  ****/..  /* Auth
197b0 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
197c0 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
197d0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
197e0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
197f0 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20    TESTONLY(i =) 
19800 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
19810 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
19820 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
19830 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
19840 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a  =SQLITE_DENY );.
19850 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
19860 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
19870 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
19880 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
19890 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
198a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
198b0 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74  t, then (by rest
198c0 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37  rictions.  ** 17
198d0 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69   and 18 above) i
198e0 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  t must be a UNIO
198f0 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61  N ALL and the pa
19900 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20  rent query must 
19910 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20  .  ** be of the 
19920 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
19930 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72      SELECT <expr
19940 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75  -list> FROM (<su
19950 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65  b-query>) <where
19960 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20  -clause> .  **. 
19970 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
19980 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
19990 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45  MIT and/or OFFSE
199a0 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20  T clauses. This 
199b0 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74  block.  ** creat
199c0 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66  es N-1 copies of
199d0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
199e0 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
199f0 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
19a00 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
19a10 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
19a20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
19a30 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
19a40 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
19a50 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
19a60 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
19a70 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
19a80 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
19a90 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
19aa0 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
19ab0 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
19ac0 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  ry..  **.  ** Ex
19ad0 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
19ae0 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20       SELECT a+1 
19af0 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20  FROM (.  **     
19b00 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
19b10 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
19b20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
19b30 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20         SELECT y 
19b40 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
19b50 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
19b60 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
19b70 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20  T abs(z*2) FROM 
19b80 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20  tab2.  **     ) 
19b90 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52  WHERE a!=5 ORDER
19ba0 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
19bb0 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
19bc0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
19bd0 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
19be0 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35  tab WHERE x+1!=5
19bf0 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
19c00 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
19c10 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62  ECT y+1 FROM tab
19c20 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20   WHERE y+1!=5.  
19c30 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
19c40 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
19c50 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d   abs(z*2)+1 FROM
19c60 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28   tab2 WHERE abs(
19c70 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  z*2)+1!=5.  **  
19c80 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20     ORDER BY 1.  
19c90 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20  **.  ** We call 
19ca0 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75  this the "compou
19cb0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
19cc0 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20  tening"..  */.  
19cd0 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
19ce0 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
19cf0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
19d00 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
19d10 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
19d20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
19d30 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
19d40 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
19d50 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63  Limit;.    Selec
19d60 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
19d70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
19d80 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
19d90 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
19da0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
19db0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
19dc0 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
19dd0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
19de0 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d  b, p, 0);.    p-
19df0 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
19e00 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
19e10 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
19e20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
19e30 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ;.    p->op = TK
19e40 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70 52 69  _ALL;.    p->pRi
19e50 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20  ghtmost = 0;.   
19e60 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
19e70 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 50 72        pNew = pPr
19e80 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ior;.    }else{.
19e90 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69        pNew->pPri
19ea0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
19eb0 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d     pNew->pRightm
19ec0 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ost = 0;.    }. 
19ed0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
19ee0 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  New;.    if( db-
19ef0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
19f00 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
19f10 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65   /* Begin flatte
19f20 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74  ning the iFrom-t
19f30 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  h entry of the F
19f40 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a  ROM clause .  **
19f50 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
19f60 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62  ery..  */.  pSub
19f70 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69   = pSub1 = pSubi
19f80 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20  tem->pSelect;.. 
19f90 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74   /* Delete the t
19fa0 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
19fb0 74 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61  tructure associa
19fc0 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
19fd0 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a  * subquery.  */.
19fe0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19ff0 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  db, pSubitem->zD
1a000 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69  atabase);.  sqli
1a010 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1a020 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ubitem->zName);.
1a030 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1a040 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41  db, pSubitem->zA
1a050 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65  lias);.  pSubite
1a060 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30  m->zDatabase = 0
1a070 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  ;.  pSubitem->zN
1a080 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ame = 0;.  pSubi
1a090 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b  tem->zAlias = 0;
1a0a0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65  .  pSubitem->pSe
1a0b0 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  lect = 0;..  /* 
1a0c0 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74  Defer deleting t
1a0d0 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
1a0e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1a0f0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1a100 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e  y until code gen
1a110 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  eration is.  ** 
1a120 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20  complete, since 
1a130 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20  there may still 
1a140 65 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20  exist Expr.pTab 
1a150 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a  entries that.  *
1a160 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73  * refer to the s
1a170 75 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74  ubquery even aft
1a180 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20  er flattening.  
1a190 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20  Ticket #3346..  
1a1a0 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d  **.  ** pSubitem
1a1b0 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73  ->pTab is always
1a1c0 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73   non-NULL by tes
1a1d0 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61  t restrictions a
1a1e0 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a  nd tests above..
1a1f0 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59    */.  if( ALWAY
1a200 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  S(pSubitem->pTab
1a210 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c  !=0) ){.    Tabl
1a220 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70  e *pTabToDel = p
1a230 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  Subitem->pTab;. 
1a240 20 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c     if( pTabToDel
1a250 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20  ->nRef==1 ){.   
1a260 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65     Parse *pTople
1a270 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
1a280 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
1a290 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  e);.      pTabTo
1a2a0 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65  Del->pNextZombie
1a2b0 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a   = pToplevel->pZ
1a2c0 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20  ombieTab;.      
1a2d0 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1a2e0 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65  ieTab = pTabToDe
1a2f0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
1a300 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e      pTabToDel->n
1a310 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  Ref--;.    }.   
1a320 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20   pSubitem->pTab 
1a330 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  = 0;.  }..  /* T
1a340 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f  he following loo
1a350 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  p runs once for 
1a360 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63  each term in a c
1a370 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
1a380 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67  .  ** flattening
1a390 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20 61   (as described a
1a3a0 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61 72  bove).  If we ar
1a3b0 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72  e doing a differ
1a3c0 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66  ent kind.  ** of
1a3d0 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20   flattening - a 
1a3e0 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72  flattening other
1a3f0 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64   than a compound
1a400 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
1a410 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e  ning -.  ** then
1a420 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20   this loop only 
1a430 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a  runs once..  **.
1a440 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d    ** This loop m
1a450 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20  oves all of the 
1a460 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66  FROM elements of
1a470 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
1a480 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  to the.  ** the 
1a490 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1a4a0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
1a4b0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   Before doing th
1a4c0 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  is, remember.  *
1a4d0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
1a4e0 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
1a4f0 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
1a500 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
1a510 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20  .  ** iParent.  
1a520 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73  The iParent curs
1a530 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  or will never be
1a540 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65   used.  Subseque
1a550 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c  nt code.  ** wil
1a560 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f  l scan expressio
1a570 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69  ns looking for i
1a580 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65  Parent reference
1a590 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20  s and replace.  
1a5a0 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e  ** those referen
1a5b0 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73  ces with express
1a5c0 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76  ions that resolv
1a5d0 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  e to the subquer
1a5e0 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d  y FROM.  ** elem
1a5f0 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20  ents we are now 
1a600 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f  copying in..  */
1a610 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70  .  for(pParent=p
1a620 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65  ; pParent; pPare
1a630 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69  nt=pParent->pPri
1a640 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70  or, pSub=pSub->p
1a650 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20  Prior){.    int 
1a660 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20  nSubSrc;.    u8 
1a670 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
1a680 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
1a690 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
1a6a0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ROM clause of su
1a6b0 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53  bquery */.    nS
1a6c0 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d  ubSrc = pSubSrc-
1a6d0 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65  >nSrc;  /* Numbe
1a6e0 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75  r of terms in su
1a6f0 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75  bquery FROM clau
1a700 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d  se */.    pSrc =
1a710 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20   pParent->pSrc; 
1a720 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
1a730 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
1a740 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66  query */..    if
1a750 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ( pSrc ){.      
1a760 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d  assert( pParent=
1a770 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20  =p );  /* First 
1a780 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65  time through the
1a790 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a   loop */.      j
1a7a0 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74  ointype = pSubit
1a7b0 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
1a7c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1a7d0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d  ssert( pParent!=
1a7e0 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64  p );  /* 2nd and
1a7f0 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65   subsequent time
1a800 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  s through the lo
1a810 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63  op */.      pSrc
1a820 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
1a830 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1a840 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30  tAppend(db, 0, 0
1a850 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1a860 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pSrc==0 ){.     
1a870 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
1a880 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1a890 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1a8a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1a8b0 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
1a8c0 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73   uses a single s
1a8d0 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  lot of the FROM 
1a8e0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1a8f0 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ter.    ** query
1a900 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  .  If the subque
1a910 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  ry has more than
1a920 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20   one element in 
1a930 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  its FROM clause,
1a940 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70  .    ** then exp
1a950 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1a960 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  ery to make spac
1a970 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64  e for it to hold
1a980 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20   all elements.  
1a990 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71    ** of the subq
1a9a0 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uery..    **.   
1a9b0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
1a9c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45   **.    **    SE
1a9d0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41  LECT * FROM tabA
1a9e0 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , (SELECT * FROM
1a9f0 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61   sub1, sub2), ta
1aa00 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  bB;.    **.    *
1aa10 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72  * The outer quer
1aa20 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e  y has 3 slots in
1aa30 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
1aa40 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74  .  One slot of t
1aa50 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
1aa60 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c  query (the middl
1aa70 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20  e slot) is used 
1aa80 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  by the subquery.
1aa90 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a    The next.    *
1aaa0 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  * block of code 
1aab0 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20  will expand the 
1aac0 6f 75 74 20 71 75 65 72 79 20 74 6f 20 34 20 73  out query to 4 s
1aad0 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69 64 64 6c  lots.  The middl
1aae0 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73  e.    ** slot is
1aaf0 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f   expanded to two
1ab00 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20   slots in order 
1ab10 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f  to make space fo
1ab20 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f  r the.    ** two
1ab30 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
1ab40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1ab50 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
1ab60 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75    */.    if( nSu
1ab70 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  bSrc>1 ){.      
1ab80 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1ab90 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
1aba0 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
1abb0 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31   pSrc, nSubSrc-1
1abc0 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20  ,iFrom+1);.     
1abd0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1abe0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
1abf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1ac00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72      }..    /* Tr
1ac10 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20  ansfer the FROM 
1ac20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f  clause terms fro
1ac30 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  m the subquery i
1ac40 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nto the.    ** o
1ac50 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
1ac60 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
1ac70 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b  i<nSubSrc; i++){
1ac80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64  .      sqlite3Id
1ac90 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1aca0 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e  Src->a[i+iFrom].
1acb0 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 70  pUsing);.      p
1acc0 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
1acd0 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
1ace0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
1acf0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c  SubSrc->a[i], 0,
1ad00 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d   sizeof(pSubSrc-
1ad10 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  >a[i]));.    }. 
1ad20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d     pSrc->a[iFrom
1ad30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
1ad40 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
1ad50 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
1ad60 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
1ad70 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
1ad80 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
1ad90 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
1ada0 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
1adb0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1adc0 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
1add0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1ade0 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
1adf0 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
1ae00 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
1ae10 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
1ae20 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
1ae30 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
1ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1ae50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
1ae60 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
1ae70 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
1ae80 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
1ae90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
1aea0 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
1aeb0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1aec0 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
1aed0 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
1aee0 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
1aef0 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
1af00 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
1af10 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
1af20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
1af30 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
1af40 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
1af50 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
1af60 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
1af70 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20     */.    pList 
1af80 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  = pParent->pELis
1af90 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
1afa0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1afb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
1afc0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1afd0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1afe0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
1aff0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
1b000 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53  , pList->a[i].zS
1b010 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pan);.        sq
1b020 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
1b030 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  me);.        pLi
1b040 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
1b050 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a   zName;.      }.
1b060 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74 45      }.    substE
1b070 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
1b080 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61  ent->pEList, iPa
1b090 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1b0a0 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73 41  st);.    if( isA
1b0b0 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  gg ){.      subs
1b0c0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50  tExprList(db, pP
1b0d0 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c  arent->pGroupBy,
1b0e0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1b0f0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  pEList);.      p
1b100 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
1b110 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1b120 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1b130 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1b140 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  >pEList);.    }.
1b150 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
1b160 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1b170 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1b180 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
1b190 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1b1a0 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
1b1b0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
1b1c0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pSub->pOrderBy =
1b1d0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1b1e0 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  ( pParent->pOrde
1b1f0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 75 62  rBy ){.      sub
1b200 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
1b210 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1b220 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1b230 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  >pEList);.    }.
1b240 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57      if( pSub->pW
1b250 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70 57  here ){.      pW
1b260 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
1b270 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
1b280 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
1b290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68  }else{.      pWh
1b2a0 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ere = 0;.    }. 
1b2b0 20 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49     if( subqueryI
1b2c0 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73  sAgg ){.      as
1b2d0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1b2e0 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20  Having==0 );.   
1b2f0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
1b300 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ing = pParent->p
1b310 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61  Where;.      pPa
1b320 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70  rent->pWhere = p
1b330 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61  Where;.      pPa
1b340 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
1b350 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
1b360 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
1b370 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1b380 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  EList);.      pP
1b390 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
1b3a0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
1b3b0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
1b3c0 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20  ving, .         
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b3f0 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
1b400 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a  ->pHaving, 0));.
1b410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1b420 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d  arent->pGroupBy=
1b430 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
1b440 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  ent->pGroupBy = 
1b450 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1b460 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72  up(db, pSub->pGr
1b470 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d  oupBy, 0);.    }
1b480 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72  else{.      pPar
1b490 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 75  ent->pWhere = su
1b4a0 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
1b4b0 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69 50 61  ent->pWhere, iPa
1b4c0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1b4d0 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
1b4e0 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  nt->pWhere = sql
1b4f0 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
1b500 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c  pParent->pWhere,
1b510 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a   pWhere);.    }.
1b520 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c    .    /* The fl
1b530 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
1b540 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
1b550 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
1b560 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1b570 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
1b580 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nct. .    */.   
1b590 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61   pParent->selFla
1b5a0 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46  gs |= pSub->selF
1b5b0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1b5c0 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20  ct;.  .    /*.  
1b5d0 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20    ** SELECT ... 
1b5e0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
1b5f0 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20   LIMIT a OFFSET 
1b600 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45  b) LIMIT x OFFSE
1b610 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  T y;.    **.    
1b620 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65  ** One is tempte
1b630 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20  d to try to add 
1b640 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69  a and b to combi
1b650 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20  ne the limits.  
1b660 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  But this.    ** 
1b670 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
1b680 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
1b690 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a   negative..    *
1b6a0 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
1b6b0 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
1b6c0 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20  pParent->pLimit 
1b6d0 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a  = pSub->pLimit;.
1b6e0 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d        pSub->pLim
1b6f0 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  it = 0;.    }.  
1b700 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  }..  /* Finially
1b710 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
1b720 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
1b730 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
1b740 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
1b750 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
1b760 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
1b770 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ub1);..  return 
1b780 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  1;.}.#endif /* !
1b790 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1b7a0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1b7b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1b7c0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
1b7d0 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
1b7e0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1b7f0 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  nt passed as an 
1b800 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20  argument to see 
1b810 69 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69  if it.** is a mi
1b820 6e 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65  n() or max() que
1b830 72 79 2e 20 52 65 74 75 72 6e 20 57 48 45 52 45  ry. Return WHERE
1b840 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
1b850 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
1b860 58 20 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20  X if .** it is, 
1b870 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20  or 0 otherwise. 
1b880 41 74 20 70 72 65 73 65 6e 74 2c 20 61 20 71 75  At present, a qu
1b890 65 72 79 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ery is considere
1b8a0 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e  d to be.** a min
1b8b0 28 29 2f 6d 61 78 28 29 20 71 75 65 72 79 20 69  ()/max() query i
1b8c0 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68  f:.**.**   1. Th
1b8d0 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ere is a single 
1b8e0 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 46 52  object in the FR
1b8f0 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
1b900 20 20 20 32 2e 20 54 68 65 72 65 20 69 73 20 61     2. There is a
1b910 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73 69   single expressi
1b920 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  on in the result
1b930 20 73 65 74 2c 20 61 6e 64 20 69 74 20 69 73 0a   set, and it is.
1b940 2a 2a 20 20 20 20 20 20 65 69 74 68 65 72 20 6d  **      either m
1b950 69 6e 28 78 29 20 6f 72 20 6d 61 78 28 78 29 2c  in(x) or max(x),
1b960 20 77 68 65 72 65 20 78 20 69 73 20 61 20 63 6f   where x is a co
1b970 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2e 0a  lumn reference..
1b980 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e  */.static u8 min
1b990 4d 61 78 51 75 65 72 79 28 53 65 6c 65 63 74 20  MaxQuery(Select 
1b9a0 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78  *p){.  Expr *pEx
1b9b0 70 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  pr;.  ExprList *
1b9c0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
1b9d0 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c 69 73  st;..  if( pELis
1b9e0 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65  t->nExpr!=1 ) re
1b9f0 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
1ba00 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78  BY_NORMAL;.  pEx
1ba10 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30  pr = pEList->a[0
1ba20 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
1ba30 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
1ba40 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
1ba50 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45  rn 0;.  if( NEVE
1ba60 52 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  R(ExprHasPropert
1ba70 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1ba80 65 6c 65 63 74 29 29 20 29 20 72 65 74 75 72 6e  elect)) ) return
1ba90 20 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   0;.  pEList = p
1baa0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1bab0 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c   if( pEList==0 |
1bac0 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  | pEList->nExpr!
1bad0 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
1bae0 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30   if( pEList->a[0
1baf0 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ].pExpr->op!=TK_
1bb00 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  AGG_COLUMN ) ret
1bb10 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
1bb20 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 61 73 73 65  Y_NORMAL;.  asse
1bb30 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1bb40 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
1bb50 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 69 66  ntValue) );.  if
1bb60 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1bb70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1bb80 2c 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20  ,"min")==0 ){.  
1bb90 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f    return WHERE_O
1bba0 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65  RDERBY_MIN;.  }e
1bbb0 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
1bbc0 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e  trICmp(pExpr->u.
1bbd0 7a 54 6f 6b 65 6e 2c 22 6d 61 78 22 29 3d 3d 30  zToken,"max")==0
1bbe0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
1bbf0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1bc00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  ;.  }.  return W
1bc10 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
1bc20 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  MAL;.}../*.** Th
1bc30 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
1bc40 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
1bc50 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1bc60 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
1bc70 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65  query..** The se
1bc80 63 6f 6e 64 20 61 72 67 6d 65 6e 74 20 69 73 20  cond argment is 
1bc90 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61  the associated a
1bca0 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62  ggregate-info ob
1bcb0 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ject. This .** f
1bcc0 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66  unction tests if
1bcd0 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
1bce0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
1bcf0 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
1bd00 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a  (*) FROM <tbl>.*
1bd10 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65  *.** where table
1bd20 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74   is a database t
1bd30 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d  able, not a sub-
1bd40 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
1bd50 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20  If the query.** 
1bd60 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20  does match this 
1bd70 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20  pattern, then a 
1bd80 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
1bd90 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72  able object repr
1bda0 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c  esenting.** <tbl
1bdb0 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  > is returned. O
1bdc0 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
1bdd0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1bde0 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70  ic Table *isSimp
1bdf0 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a  leCount(Select *
1be00 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  p, AggInfo *pAgg
1be10 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Info){.  Table *
1be20 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  pTab;.  Expr *pE
1be30 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  xpr;..  assert( 
1be40 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a  !p->pGroupBy );.
1be50 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
1be60 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
1be70 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70  Expr!=1 .   || p
1be80 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
1be90 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  || p->pSrc->a[0]
1bea0 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20  .pSelect.  ){.  
1beb0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1bec0 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
1bed0 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70  ->a[0].pTab;.  p
1bee0 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
1bef0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
1bf00 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
1bf10 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26  !pTab->pSelect &
1bf20 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66  & pExpr );..  if
1bf30 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
1bf40 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1bf50 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
1bf60 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
1bf70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1bf80 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d   NEVER(pAggInfo-
1bf90 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74  >nFunc==0) ) ret
1bfa0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41  urn 0;.  if( (pA
1bfb0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
1bfc0 2e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 26 53 51  .pFunc->flags&SQ
1bfd0 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29  LITE_FUNC_COUNT)
1bfe0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1bff0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
1c000 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29  gs&EP_Distinct )
1c010 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65   return 0;..  re
1c020 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
1c030 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63  .** If the sourc
1c040 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73  e-list item pass
1c050 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
1c060 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20  t was augmented 
1c070 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58  with an.** INDEX
1c080 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
1c090 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65  en try to locate
1c0a0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69   the specified i
1c0b0 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a  ndex. If there.*
1c0c0 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61  * was such a cla
1c0d0 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  use and the name
1c0e0 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62  d index cannot b
1c0f0 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
1c100 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
1c110 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72   and leave an er
1c120 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f  ror in pParse. O
1c130 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61  therwise, popula
1c140 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49  te .** pFrom->pI
1c150 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20  ndex and return 
1c160 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
1c170 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  t sqlite3Indexed
1c180 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a  ByLookup(Parse *
1c190 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
1c1a0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
1c1b0 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d  om){.  if( pFrom
1c1c0 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d  ->pTab && pFrom-
1c1d0 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54  >zIndex ){.    T
1c1e0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
1c1f0 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68  om->pTab;.    ch
1c200 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72  ar *zIndex = pFr
1c210 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20  om->zIndex;.    
1c220 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
1c230 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
1c240 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20  pIndex; .       
1c250 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33   pIdx && sqlite3
1c260 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e  StrICmp(pIdx->zN
1c270 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20  ame, zIndex); . 
1c280 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78         pIdx=pIdx
1c290 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20  ->pNext.    );. 
1c2a0 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a     if( !pIdx ){.
1c2b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1c2c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1c2d0 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73  o such index: %s
1c2e0 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20  ", zIndex, 0);. 
1c2f0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
1c300 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
1c310 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c320 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
1c330 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78     pFrom->pIndex
1c340 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72   = pIdx;.  }.  r
1c350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1c370 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b  outine is a Walk
1c380 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  er callback for 
1c390 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45  "expanding" a SE
1c3a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
1c3b0 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d  ** "Expanding" m
1c3c0 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66  eans to do the f
1c3d0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
1c3e0 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
1c3f0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
1c400 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
1c410 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
1c420 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
1c430 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
1c440 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
1c450 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
1c460 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
1c470 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
1c480 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
1c490 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
1c4a0 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
1c4b0 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
1c4c0 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
1c4d0 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
1c4e0 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
1c4f0 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
1c500 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
1c510 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1c520 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
1c530 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
1c540 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
1c550 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
1c560 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
1c570 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
1c580 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
1c590 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
1c5a0 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
1c5b0 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
1c5c0 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
1c5d0 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
1c5e0 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74  g up the presist
1c5f0 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
1c600 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
1c610 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
1c620 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
1c630 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
1c640 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f  clause to accomo
1c650 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
1c660 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
1c670 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
1c680 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
1c690 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
1c6a0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
1c6b0 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
1c6c0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
1c6d0 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
1c6e0 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
1c6f0 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
1c700 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
1c710 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
1c720 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
1c730 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
1c740 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
1c750 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
1c760 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
1c770 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
1c780 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
1c790 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
1c7a0 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
1c7b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1c7c0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61  electExpander(Wa
1c7d0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
1c7e0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
1c7f0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
1c800 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
1c810 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53  int i, j, k;.  S
1c820 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1c830 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
1c840 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
1c850 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
1c860 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  om;.  sqlite3 *d
1c870 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1c880 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1c890 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20  cFailed  ){.    
1c8a0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1c8b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45  ;.  }.  if( NEVE
1c8c0 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c  R(p->pSrc==0) ||
1c8d0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1c8e0 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
1c8f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
1c900 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70  C_Prune;.  }.  p
1c910 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
1c920 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 70 54 61  _Expanded;.  pTa
1c930 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1c940 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
1c950 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  EList;..  /* Mak
1c960 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
1c970 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
1c980 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
1c990 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
1c9a0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1c9b0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
1c9c0 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
1c9d0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
1c9e0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
1c9f0 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
1ca00 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
1ca10 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
1ca20 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1ca30 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
1ca40 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
1ca50 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
1ca60 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
1ca70 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
1ca80 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
1ca90 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
1caa0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
1cab0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
1cac0 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
1cad0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
1cae0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
1caf0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
1cb00 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1cb10 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
1cb20 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
1cb30 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21  if( pFrom->pTab!
1cb40 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
1cb50 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
1cb60 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
1cb70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20  repared.  There 
1cb80 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20  is no need.     
1cb90 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65   ** to go furthe
1cba0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
1cbb0 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( i==0 );.    
1cbc0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
1cbd0 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ne;.    }.    if
1cbe0 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
1cbf0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
1cc00 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1cc10 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  Y.      Select *
1cc20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
1cc30 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20  elect;.      /* 
1cc40 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
1cc50 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1cc60 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
1cc70 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
1cc80 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1cc90 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
1cca0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1ccb0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
1ccc0 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
1ccd0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
1cce0 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
1ccf0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1cd00 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
1cd10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
1cd20 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1cd30 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
1cd40 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
1cd50 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
1cd60 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1cd70 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75 62  (db, "sqlite_sub
1cd80 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69  query_%p_", (voi
1cd90 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20  d*)pTab);.      
1cda0 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
1cdb0 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53  ior ){ pSel = pS
1cdc0 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20  el->pPrior; }.  
1cdd0 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e      selectColumn
1cde0 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
1cdf0 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69  arse, pSel->pELi
1ce00 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
1ce10 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
1ce20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79       pTab->iPKey
1ce30 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61   = -1;.      pTa
1ce40 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 30  b->nRowEst = 100
1ce50 30 30 30 30 3b 0a 20 20 20 20 20 20 70 54 61 62  0000;.      pTab
1ce60 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
1ce70 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64  _Ephemeral;.#end
1ce80 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  if.    }else{.  
1ce90 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61      /* An ordina
1cea0 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  ry table or view
1ceb0 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f   name in the FRO
1cec0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
1ced0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
1cee0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
1cef0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
1cf00 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
1cf10 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
1cf20 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b  arse, 0, pFrom);
1cf30 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
1cf40 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1cf50 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
1cf60 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21  b->nRef++;.#if !
1cf70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1cf80 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
1cf90 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
1cfa0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
1cfb0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
1cfc0 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69  >pSelect || IsVi
1cfd0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
1cfe0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
1cff0 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
1d000 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
1d010 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
1d020 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1d030 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
1d040 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
1d050 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
1d060 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  C_Abort;.       
1d070 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
1d080 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
1d090 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
1d0a0 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
1d0b0 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
1d0c0 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
1d0d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
1d0e0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
1d0f0 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  , pFrom->pSelect
1d100 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1d110 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
1d120 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
1d130 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
1d140 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
1d150 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
1d160 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
1d170 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
1d180 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
1d190 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
1d1a0 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
1d1b0 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
1d1c0 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
1d1d0 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
1d1e0 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
1d1f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
1d200 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
1d210 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
1d220 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
1d230 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
1d240 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
1d250 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
1d260 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
1d270 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
1d280 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
1d290 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
1d2a0 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
1d2b0 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
1d2c0 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
1d2d0 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
1d2e0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
1d2f0 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
1d300 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
1d310 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
1d320 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
1d330 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72   TK_ALL operator
1d340 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
1d350 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
1d360 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  he column list..
1d370 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
1d380 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
1d390 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
1d3a0 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  K_ALL expression
1d3b0 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a  s and expand.  *
1d3c0 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  * each one to th
1d3d0 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
1d3e0 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
1d3f0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
1d400 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
1d410 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
1d420 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
1d430 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
1d440 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
1d450 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
1d460 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
1d470 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
1d480 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
1d490 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
1d4a0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
1d4b0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
1d4c0 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
1d4d0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
1d4e0 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
1d4f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1d500 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
1d510 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
1d520 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
1d530 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
1d540 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
1d550 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
1d560 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
1d570 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
1d580 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
1d590 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
1d5a0 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
1d5b0 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
1d5c0 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
1d5d0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
1d5e0 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
1d5f0 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1d600 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
1d610 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
1d620 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
1d630 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1d640 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
1d650 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
1d660 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
1d670 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
1d680 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
1d690 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
1d6a0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
1d6b0 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
1d6c0 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
1d6d0 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
1d6e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
1d6f0 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d710 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
1d720 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
1d730 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66  ames)==0;..    f
1d740 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
1d750 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
1d760 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
1d770 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
1d780 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
1d790 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
1d7a0 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
1d7b0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
1d7c0 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70  K_ALL && (pE->op
1d7d0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e  !=TK_DOT || pE->
1d7e0 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
1d7f0 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
1d800 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
1d810 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
1d820 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1d830 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
1d840 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
1d850 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1d860 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1d870 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
1d880 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
1d890 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
1d8a0 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
1d8b0 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
1d8c0 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
1d8d0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
1d8e0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
1d8f0 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70  zSpan = a[k].zSp
1d900 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b  an;.          a[
1d910 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
1d920 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70          a[k].zSp
1d930 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  an = 0;.        
1d940 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
1d950 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
1d960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1d970 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  * This expressio
1d980 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20  n is a "*" or a 
1d990 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65  "TABLE.*" and ne
1d9a0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20  eds to be.      
1d9b0 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a    ** expanded. *
1d9c0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61  /.        int ta
1d9d0 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20  bleSeen = 0;    
1d9e0 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68    /* Set to 1 wh
1d9f0 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73  en TABLE matches
1da00 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
1da10 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20   *zTName;       
1da20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20       /* text of 
1da30 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f  name of TABLE */
1da40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d  .        if( pE-
1da50 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
1da60 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1da70 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b   pE->pLeft!=0 );
1da80 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1da90 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1daa0 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45  rty(pE->pLeft, E
1dab0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1dac0 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
1dad0 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a  = pE->pLeft->u.z
1dae0 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  Token;.        }
1daf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1db00 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  zTName = 0;.    
1db10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
1db20 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
1db30 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
1db40 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1db50 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
1db60 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
1db70 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
1db80 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1db90 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
1dba0 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
1dbb0 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
1dbc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1dbd0 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
1dbe0 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
1dbf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1dc00 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1dc10 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
1dc20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
1dc30 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ame && sqlite3St
1dc40 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
1dc50 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  abName)!=0 ){.  
1dc60 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1dc70 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
1dc80 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
1dc90 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
1dca0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
1dcb0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
1dcd0 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74   *pExpr, *pRight
1dce0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
1dcf0 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
1dd00 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
1dd10 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
1dd20 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  r *zColname;  /*
1dd30 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f   The computed co
1dd40 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  lumn name */.   
1dd50 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
1dd60 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c  ToFree;   /* Mal
1dd70 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61  loced string tha
1dd80 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
1dd90 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eed */.         
1dda0 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d     Token sColnam
1ddb0 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20  e;  /* Computed 
1ddc0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61  column name as a
1ddd0 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20   token */..     
1dde0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
1ddf0 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
1de00 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72  as 'hidden' (cur
1de10 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73  rently only poss
1de20 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  ible.           
1de30 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20   ** for virtual 
1de40 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20  tables), do not 
1de50 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68  include it in th
1de60 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
1de70 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
1de80 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  -set list..     
1de90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1dea0 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
1deb0 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
1dec0 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  aCol[j]) ){.    
1ded0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1dee0 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  (IsVirtual(pTab)
1def0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1df00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1df10 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1df20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
1df30 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   zTName==0 ){.  
1df40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1df50 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65  (pFrom->jointype
1df60 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
1df70 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
1df80 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c    && tableAndCol
1df90 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73  umnIndex(pTabLis
1dfa0 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  t, i, zName, 0, 
1dfb0 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
1dfc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1dfd0 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
1dfe0 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
1dff0 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
1e000 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
1e010 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
1e020 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  le to the right 
1e030 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  of the join */. 
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1e050 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e060 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e070 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1e080 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46  e3IdListIndex(pF
1e090 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61  rom->pUsing, zNa
1e0a0 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
1e0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
1e0c0 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53  a join with a US
1e0d0 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74  ING clause, omit
1e0e0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a   columns in the.
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20  ** using clause 
1e110 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f  from the table o
1e120 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a  n the right. */.
1e130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e140 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1e150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e170 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c      pRight = sql
1e180 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
1e190 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ID, zName);.    
1e1a0 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
1e1b0 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
1e1c0 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
1e1d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
1e1e0 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20  f( longNames || 
1e1f0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31  pTabList->nSrc>1
1e200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e210 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20    Expr *pLeft;. 
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65               pLe
1e230 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
1e240 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62  (db, TK_ID, zTab
1e250 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
1e260 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
1e270 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1e280 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
1e290 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20   pRight, 0);.   
1e2a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
1e2b0 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
1e2c0 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
1e2d0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
1e2e0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
1e2f0 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
1e300 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1e310 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
1e320 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
1e330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e340 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e350 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
1e360 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
1e370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e380 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1e390 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1e3a0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
1e3b0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
1e3c0 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20     sColname.z = 
1e3d0 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
1e3e0 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e        sColname.n
1e3f0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1e400 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  30(zColname);.  
1e410 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e420 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
1e430 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26  (pParse, pNew, &
1e440 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  sColname, 0);.  
1e450 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e460 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
1e470 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
1e480 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1e490 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
1e4a0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
1e4b0 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
1e4c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e4d0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1e4e0 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1e4f0 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
1e500 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1e510 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1e520 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1e530 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
1e540 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
1e550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e560 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1e570 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1e580 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1e590 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
1e5a0 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
1e5b0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
1e5c0 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
1e5d0 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
1e5e0 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
1e5f0 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
1e600 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
1e610 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1e620 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
1e630 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
1e640 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
1e650 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
1e660 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1e670 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72  }../*.** No-op r
1e680 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70  outine for the p
1e690 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72  arse-tree walker
1e6a0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1e6b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
1e6c0 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
1e6d0 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65  lback then expre
1e6e0 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61  ssion trees.** a
1e6f0 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75  re walked withou
1e700 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65  t any actions be
1e710 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63  ing taken at eac
1e720 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61  h node.  Presuma
1e730 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69  bly,.** when thi
1e740 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1e750 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78  d for Walker.xEx
1e760 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
1e770 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  .** Walker.xSele
1e780 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65  ctCallback is se
1e790 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  t to do somethin
1e7a0 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65  g useful for eve
1e7b0 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ry .** subquery 
1e7c0 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
1e7d0 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
1e7e0 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57  t exprWalkNoop(W
1e7f0 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
1e800 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b  Expr *NotUsed2){
1e810 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1e820 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
1e830 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
1e840 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1e850 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1e860 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
1e870 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1e880 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
1e890 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
1e8a0 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
1e8b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
1e8c0 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
1e8d0 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
1e8e0 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
1e8f0 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
1e900 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
1e910 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
1e920 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
1e930 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
1e940 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
1e950 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
1e960 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
1e970 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
1e980 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
1e990 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
1e9a0 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
1e9b0 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
1e9c0 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
1e9d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
1e9e0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
1e9f0 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
1ea00 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
1ea10 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
1ea20 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1ea30 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
1ea40 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
1ea50 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
1ea60 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
1ea70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1ea80 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
1ea90 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
1eaa0 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
1eab0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
1eac0 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
1ead0 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65  alker w;.  w.xSe
1eae0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
1eaf0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20  electExpander;. 
1eb00 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
1eb10 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
1eb20 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
1eb30 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
1eb40 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
1eb50 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  elect);.}...#ifn
1eb60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1eb70 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
1eb80 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e  his is a Walker.
1eb90 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1eba0 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
1ebb0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79   sqlite3SelectTy
1ebc0 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65  peInfo().** inte
1ebd0 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rface..**.** For
1ebe0 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73   each FROM-claus
1ebf0 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20  e subquery, add 
1ec00 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64  Column.zType and
1ec10 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a   Column.zColl.**
1ec20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
1ec30 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
1ec40 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
1ec50 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
1ec60 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75  et.** of that su
1ec70 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
1ec80 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
1ec90 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
1eca0 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
1ecb0 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
1ecc0 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70  .** by selectExp
1ecd0 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20  ander() but the 
1ece0 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
1ecf0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  on information w
1ed00 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74  as omitted.** at
1ed10 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61   that point beca
1ed20 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20  use identifiers 
1ed30 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  had not yet been
1ed40 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73   resolved.  This
1ed50 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
1ed60 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e  alled after iden
1ed70 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f  tifier resolutio
1ed80 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1ed90 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
1eda0 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65  ryTypeInfo(Walke
1edb0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
1edc0 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
1edd0 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  *pParse;.  int i
1ede0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
1edf0 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
1ee00 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
1ee10 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rom;..  assert( 
1ee20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1ee30 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69  _Resolved );.  i
1ee40 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1ee50 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
1ee60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73  )==0 ){.    p->s
1ee70 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61  elFlags |= SF_Ha
1ee80 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70  sTypeInfo;.    p
1ee90 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
1eea0 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61  >pParse;.    pTa
1eeb0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1eec0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  .    for(i=0, pF
1eed0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
1eee0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1eef0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
1ef00 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
1ef10 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
1ef20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  b;.      if( ALW
1ef30 41 59 53 28 70 54 61 62 21 3d 30 29 20 26 26 20  AYS(pTab!=0) && 
1ef40 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
1ef50 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
1ef60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1ef70 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
1ef80 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1ef90 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
1efa0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
1efb0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
1efc0 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 61 73  lect;.        as
1efd0 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20 20  sert( pSel );.  
1efe0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
1eff0 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  l->pPrior ) pSel
1f000 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
1f010 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 41  .        selectA
1f020 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
1f030 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
1f040 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
1f050 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 29 3b 0a  b->aCol, pSel);.
1f060 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f070 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
1f080 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69  ontinue;.}.#endi
1f090 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
1f0a0 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61  outine adds data
1f0b0 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
1f0c0 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f  ng sequence info
1f0d0 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68  rmation to.** th
1f0e0 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
1f0f0 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63  es of all FROM-c
1f100 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
1f110 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   in a.** SELECT 
1f120 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
1f130 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   Use this routin
1f140 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  e after name res
1f150 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
1f160 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
1f170 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
1f180 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1f190 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
1f1a0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1f1b0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1f1c0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
1f1d0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
1f1e0 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
1f1f0 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e  ryTypeInfo;.  w.
1f200 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
1f210 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  exprWalkNoop;.  
1f220 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
1f230 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
1f240 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
1f250 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  ct);.#endif.}...
1f260 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1f270 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45 4c  ne sets up a SEL
1f280 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ECT statement fo
1f290 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  r processing.  T
1f2a0 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
1f2b0 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a  is accomplished:
1f2c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44  .**.**     *  VD
1f2d0 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE Cursor number
1f2e0 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  s are assigned t
1f2f0 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  o all FROM-claus
1f300 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20  e terms..**     
1f310 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62  *  Ephemeral Tab
1f320 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  le objects are c
1f330 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46  reated for all F
1f340 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1f350 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  eries..**     * 
1f360 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1f370 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65  auses are shifte
1f380 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61  d into WHERE sta
1f390 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a  tements.**     *
1f3a0 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20    Wildcards "*" 
1f3b0 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e  and "TABLE.*" in
1f3c0 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65   result sets are
1f3d0 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20   expanded..**   
1f3e0 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73    *  Identifiers
1f3f0 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   in expression a
1f400 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61  re matched to ta
1f410 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bles..**.** This
1f420 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65   routine acts re
1f430 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c  cursively on all
1f440 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
1f450 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  in the SELECT..*
1f460 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
1f470 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73  lectPrep(.  Pars
1f480 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1f490 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
1f4a0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
1f4b0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
1f4c0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
1f4d0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
1f4e0 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
1f4f0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
1f500 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
1f510 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69  ntext for contai
1f520 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ner */.){.  sqli
1f530 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e  te3 *db;.  if( N
1f540 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
1f550 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  urn;.  db = pPar
1f560 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d  se->db;.  if( p-
1f570 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
1f580 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74  asTypeInfo ) ret
1f590 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
1f5a0 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73  lectExpand(pPars
1f5b0 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61  e, p);.  if( pPa
1f5c0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1f5d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1f5e0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1f5f0 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61  3ResolveSelectNa
1f600 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  mes(pParse, p, p
1f610 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20  OuterNC);.  if( 
1f620 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1f630 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1f640 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1f650 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
1f660 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29  eInfo(pParse, p)
1f670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  ;.}../*.** Reset
1f680 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
1f690 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a  ccumulator..**.*
1f6a0 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20  * The aggregate 
1f6b0 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61  accumulator is a
1f6c0 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63   set of memory c
1f6d0 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a  ells that hold.*
1f6e0 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
1f6f0 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c  esults while cal
1f700 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72  culating an aggr
1f710 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20  egate.  This.** 
1f720 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
1f730 73 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72  s code that stor
1f740 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20  es NULLs in all 
1f750 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a  of those memory.
1f760 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ** cells..*/.sta
1f770 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63  tic void resetAc
1f780 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
1f790 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
1f7a0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
1f7b0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1f7c0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
1f7d0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
1f7e0 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  o_func *pFunc;. 
1f7f0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   if( pAggInfo->n
1f800 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e  Func+pAggInfo->n
1f810 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20  Column==0 ){.   
1f820 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66   return;.  }.  f
1f830 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
1f840 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
1f850 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1f860 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1f870 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
1f880 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b  ->aCol[i].iMem);
1f890 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63  .  }.  for(pFunc
1f8a0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
1f8b0 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  , i=0; i<pAggInf
1f8c0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
1f8d0 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Func++){.    sql
1f8e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1f8f0 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46  , OP_Null, 0, pF
1f900 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20  unc->iMem);.    
1f910 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
1f920 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
1f930 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
1f940 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
1f950 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1f960 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
1f970 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1f980 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c      if( pE->x.pL
1f990 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e  ist==0 || pE->x.
1f9a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
1f9b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f9c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1f9d0 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67  e, "DISTINCT agg
1f9e0 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76  regates must hav
1f9f0 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a  e exactly one ".
1fa00 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75             "argu
1fa10 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20  ment");.        
1fa20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
1fa30 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1fa40 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49  se{.        KeyI
1fa50 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
1fa60 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
1fa70 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
1fa80 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
1fa90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1faa0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
1fab0 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
1fac0 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c  iDistinct, 0, 0,
1fad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fae0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1faf0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
1fb00 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
1fb10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1fb20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
1fb30 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
1fb40 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
1fb50 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
1fb60 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
1fb70 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
1fb80 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
1fb90 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
1fba0 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
1fbb0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
1fbc0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1fbd0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1fbe0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1fbf0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1fc00 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
1fc10 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
1fc20 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
1fc30 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1fc40 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
1fc50 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
1fc60 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
1fc70 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
1fc80 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1fc90 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
1fca0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1fcb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1fcc0 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op4(v, OP_AggFin
1fcd0 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
1fce0 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
1fcf0 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20  pr : 0, 0,.     
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd10 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
1fd20 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
1fd30 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64    }.}../*.** Upd
1fd40 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ate the accumula
1fd50 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tor memory cells
1fd60 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74   for an aggregat
1fd70 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  e based on.** th
1fd80 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
1fd90 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   position..*/.st
1fda0 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65  atic void update
1fdb0 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
1fdc0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
1fdd0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
1fde0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1fdf0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1fe00 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20  i;.  int regHit 
1fe10 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48  = 0;.  int addrH
1fe20 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74  itTest = 0;.  st
1fe30 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
1fe40 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
1fe50 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
1fe60 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
1fe70 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
1fe80 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1fe90 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
1fea0 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
1feb0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
1fec0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1fed0 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
1fee0 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
1fef0 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
1ff00 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
1ff10 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1ff20 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
1ff30 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
1ff40 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1ff50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
1ff60 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1ff70 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1ff80 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
1ff90 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
1ffa0 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
1ffb0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1ffc0 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
1ffd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1ffe0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1fff0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
20000 65 67 41 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d  egAgg, 1);.    }
20010 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
20020 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
20030 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
20040 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
20050 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
20060 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
20070 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
20080 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
20090 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
200a0 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
200b0 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73  pParse, pF->iDis
200c0 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c  tinct, addrNext,
200d0 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20   1, regAgg);.   
200e0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
200f0 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53 51  Func->flags & SQ
20100 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
20110 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
20120 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
20130 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
20140 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
20150 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
20160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
20170 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
20180 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
20190 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
201a0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
201b0 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
201c0 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
201d0 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
201e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
201f0 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
20200 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
20210 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
20220 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20230 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
20240 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
20250 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
20260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20270 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20  f( regHit==0 && 
20280 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
20290 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20  ulator ) regHit 
202a0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
202b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
202c0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
202d0 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c  CollSeq, regHit,
202e0 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
202f0 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
20300 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
20310 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
20320 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c  , OP_AggStep, 0,
20330 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
20340 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
20350 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
20360 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
20370 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
20380 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
20390 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
203a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
203b0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
203c0 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
203d0 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
203e0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
203f0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
20400 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69  gg, nArg);.    i
20410 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20  f( addrNext ){. 
20420 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20430 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
20440 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
20450 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
20460 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
20470 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
20480 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e  Before populatin
20490 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
204a0 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65  r registers, cle
204b0 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ar the column ca
204c0 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  che..  ** Otherw
204d0 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74  ise, if any of t
204e0 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  he required colu
204f0 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c  mn values are al
20500 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20  ready present . 
20510 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73   ** in registers
20520 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
20530 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53  e() may use OP_S
20540 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65  Copy to copy the
20550 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70   value.  ** to p
20560 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20  C->iMem. But by 
20570 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c  the time the val
20580 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  ue is used, the 
20590 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65  original registe
205a0 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20  r.  ** may have 
205b0 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c  been used, inval
205c0 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65  idating the unde
205d0 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f  rlying buffer ho
205e0 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74  lding the.  ** t
205f0 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  ext or blob valu
20600 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38  e. See ticket [8
20610 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a  83034dcb5]..  **
20620 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f  .  ** Another so
20630 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20  lution would be 
20640 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  to change the OP
20650 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63  _SCopy used to c
20660 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20  opy cached.  ** 
20670 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f  values to an OP_
20680 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Copy..  */.  if(
20690 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61   regHit ){.    a
206a0 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c  ddrHitTest = sql
206b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
206c0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29  , OP_If, regHit)
206d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
206e0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
206f0 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  arse);.  for(i=0
20700 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
20710 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
20720 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
20730 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
20740 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
20750 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
20760 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d  , pC->iMem);.  }
20770 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
20780 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73  ectMode = 0;.  s
20790 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
207a0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
207b0 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20  if( addrHitTest 
207c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
207d0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
207e0 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a  drHitTest);.  }.
207f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
20800 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e  ingle OP_Explain
20810 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
20820 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c  the VDBE to expl
20830 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  ain a simple.** 
20840 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28  count(*) query (
20850 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
20860 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f   FROM pTab")..*/
20870 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20880 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61  OMIT_EXPLAIN.sta
20890 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
208a0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50  SimpleCount(.  P
208b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
208c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
208d0 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
208e0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
208f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20900 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
20910 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
20920 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20940 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74   /* Index used t
20950 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c  o optimize scan,
20960 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
20970 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
20980 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63  lain==2 ){.    c
20990 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69  har *zEqp = sqli
209a0 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
209b0 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42  e->db, "SCAN TAB
209c0 4c 45 20 25 73 20 25 73 25 73 28 7e 25 64 20 72  LE %s %s%s(~%d r
209d0 6f 77 73 29 22 2c 0a 20 20 20 20 20 20 20 20 70  ows)",.        p
209e0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20  Tab->zName, .   
209f0 20 20 20 20 20 70 49 64 78 20 3f 20 22 55 53 49       pIdx ? "USI
20a00 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
20a10 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
20a20 20 20 70 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a    pIdx ? pIdx->z
20a30 4e 61 6d 65 20 3a 20 22 22 2c 0a 20 20 20 20 20  Name : "",.     
20a40 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74     pTab->nRowEst
20a50 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
20a60 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
20a70 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70         pParse->p
20a80 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  Vdbe, OP_Explain
20a90 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
20aa0 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c  tId, 0, 0, zEqp,
20ab0 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20   P4_DYNAMIC.    
20ac0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
20ad0 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
20ae0 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63  impleCount(a,b,c
20af0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
20b00 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
20b10 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  r the SELECT sta
20b20 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20  tement given in 
20b30 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20  the p argument. 
20b40 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
20b50 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
20b60 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
20b70 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
20b80 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
20b90 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65   of the SelectDe
20ba0 73 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  st structure poi
20bb0 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d  nted to by argum
20bc0 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20  ent pDest.** as 
20bd0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
20be0 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20     pDest->eDest 
20bf0 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20     Result.**    
20c00 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20   ------------   
20c10 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
20c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
20c40 20 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20      SRT_Output  
20c50 20 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 72      Generate a r
20c60 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73  ow of output (us
20c70 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c  ing the OP_Resul
20c80 74 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  tRow.**         
20c90 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f              opco
20ca0 64 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77  de) for each row
20cb0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
20cc0 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  et..**.**     SR
20cd0 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e  T_Mem         On
20ce0 6c 79 20 76 61 6c 69 64 20 69 66 20 74 68 65 20  ly valid if the 
20cf0 72 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67  result is a sing
20d00 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20  le column..**   
20d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d20 20 20 53 74 6f 72 65 20 74 68 65 20 66 69 72 73    Store the firs
20d30 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
20d40 66 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77  first result row
20d50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20d60 20 20 20 20 20 20 20 20 69 6e 20 72 65 67 69 73          in regis
20d70 74 65 72 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ter pDest->iSDPa
20d80 72 6d 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20  rm then abandon 
20d90 74 68 65 20 72 65 73 74 0a 2a 2a 20 20 20 20 20  the rest.**     
20da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20db0 6f 66 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  of the query.  T
20dc0 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  his destination 
20dd0 69 6d 70 6c 69 65 73 20 22 4c 49 4d 49 54 20 31  implies "LIMIT 1
20de0 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  "..**.**     SRT
20df0 5f 53 65 74 20 20 20 20 20 20 20 20 20 54 68 65  _Set         The
20e00 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20   result must be 
20e10 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e  a single column.
20e20 20 20 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20    Store each.** 
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e40 20 20 20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c      row of resul
20e50 74 20 61 73 20 74 68 65 20 6b 65 79 20 69 6e 20  t as the key in 
20e60 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44  table pDest->iSD
20e70 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20  Parm. .**       
20e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41 70                Ap
20e90 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74 79  ply the affinity
20ea0 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20   pDest->affSdst 
20eb0 62 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a  before storing.*
20ec0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
20ed0 20 20 20 20 20 20 72 65 73 75 6c 74 73 2e 20 20        results.  
20ee0 55 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  Used to implemen
20ef0 74 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  t "IN (SELECT ..
20f00 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  .)"..**.**     S
20f10 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53  RT_Union       S
20f20 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20  tore results as 
20f30 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f  a key in a tempo
20f40 72 61 72 79 20 74 61 62 6c 65 20 0a 2a 2a 20 20  rary table .**  
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f60 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79     identified by
20f70 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e   pDest->iSDParm.
20f80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
20f90 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76  xcept      Remov
20fa0 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74  e results from t
20fb0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
20fc0 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  le pDest->iSDPar
20fd0 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
20fe0 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f  _Table       Sto
20ff0 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65  re results in te
21000 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
21010 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a  est->iSDParm..**
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21030 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b       This is lik
21040 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 65  e SRT_EphemTab e
21050 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74  xcept that the t
21060 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
21070 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 61              is a
21080 73 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61 64  ssumed to alread
21090 79 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a  y be open..**.**
210a0 20 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61       SRT_EphemTa
210b0 62 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74  b    Create an t
210c0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
210d0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 61 6e  Dest->iSDParm an
210e0 64 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20  d store.**      
210f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
21100 68 65 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e  he result there.
21110 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
21120 65 66 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a  eft open after.*
21130 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
21140 20 20 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e        returning.
21150 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53    This is like S
21160 52 54 5f 54 61 62 6c 65 20 65 78 63 65 70 74 20  RT_Table except 
21170 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
21180 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
21190 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 75 73 65   destination use
211a0 73 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  s OP_OpenEphemer
211b0 61 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20  al to create.** 
211c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211d0 20 20 20 20 74 68 65 20 74 61 62 6c 65 20 66 69      the table fi
211e0 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  rst..**.**     S
211f0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 47  RT_Coroutine   G
21200 65 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75  enerate a co-rou
21210 74 69 6e 65 20 74 68 61 74 20 72 65 74 75 72 6e  tine that return
21220 73 20 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a  s a new row of.*
21230 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
21240 20 20 20 20 20 20 72 65 73 75 6c 74 73 20 65 61        results ea
21250 63 68 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e  ch time it is in
21260 76 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e 74 72  voked.  The entr
21270 79 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20  y point.**      
21280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
21290 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  f the co-routine
212a0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65   is stored in re
212b0 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69 53  gister pDest->iS
212c0 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  DParm..**.**    
212d0 20 53 52 54 5f 45 78 69 73 74 73 20 20 20 20 20   SRT_Exists     
212e0 20 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65   Store a 1 in me
212f0 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d  mory cell pDest-
21300 3e 69 53 44 50 61 72 6d 20 69 66 20 74 68 65 20  >iSDParm if the 
21310 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  result.**       
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
21330 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a  t is not empty..
21340 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69  **.**     SRT_Di
21350 73 63 61 72 64 20 20 20 20 20 54 68 72 6f 77 20  scard     Throw 
21360 74 68 65 20 72 65 73 75 6c 74 73 20 61 77 61 79  the results away
21370 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
21380 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  by SELECT.**    
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213a0 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68   statements with
213b0 69 6e 20 74 72 69 67 67 65 72 73 20 77 68 6f 73  in triggers whos
213c0 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69  e only purpose i
213d0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
213e0 20 20 20 20 20 20 20 20 20 74 68 65 20 73 69 64           the sid
213f0 65 2d 65 66 66 65 63 74 73 20 6f 66 20 66 75 6e  e-effects of fun
21400 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ctions..**.** Th
21410 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
21420 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
21430 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
21440 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
21450 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
21460 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
21470 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
21480 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
21490 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
214a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
214b0 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
214c0 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
214d0 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
214e0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
214f0 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
21500 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20  do that..*/.int 
21510 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20  sqlite3Select(. 
21520 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
21530 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
21540 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
21550 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
21560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21570 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
21580 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
21590 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
215a0 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68  pDest      /* Wh
215b0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
215c0 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  e query results 
215d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
215e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
215f0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
21600 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
21610 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52  pWInfo;     /* R
21620 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74  eturn from sqlit
21630 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
21640 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
21650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21660 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
21670 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
21680 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tion */.  int is
21690 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Agg;            
216a0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c   /* True for sel
216b0 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22  ect lists like "
216c0 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45  count(*)" */.  E
216d0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
216e0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
216f0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72   columns to extr
21700 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  act. */.  SrcLis
21710 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20  t *pTabList;    
21720 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
21730 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f  es to select fro
21740 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  m */.  Expr *pWh
21750 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ere;          /*
21760 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
21770 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
21780 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
21790 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54  OrderBy;    /* T
217a0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
217b0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
217c0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
217d0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
217e0 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
217f0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
21800 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
21810 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
21820 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
21830 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
21840 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
21850 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
21860 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
21870 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
21880 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  on */.  int addr
21890 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f  SortIndex;     /
218a0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20  * Address of an 
218b0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
218c0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
218d0 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44    DistinctCtx sD
218e0 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f  istinct; /* Info
218f0 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
21900 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
21910 77 6f 72 64 20 2a 2f 0a 20 20 41 67 67 49 6e 66  word */.  AggInf
21920 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20  o sAggInfo;     
21930 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
21940 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74  used by aggregat
21950 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  e queries */.  i
21960 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  nt iEnd;        
21970 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
21980 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74   of the end of t
21990 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71  he query */.  sq
219a0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
219b0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
219c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
219d0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
219e0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
219f0 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65    int iRestoreSe
21a00 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
21a10 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50  >iSelectId;.  pP
21a20 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20  arse->iSelectId 
21a30 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  = pParse->iNextS
21a40 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69  electId++;.#endi
21a50 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  f..  db = pParse
21a60 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ->db;.  if( p==0
21a70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
21a80 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
21a90 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75  nErr ){.    retu
21aa0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
21ab0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
21ac0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
21ad0 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
21ae0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
21af0 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c  emset(&sAggInfo,
21b00 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49   0, sizeof(sAggI
21b10 6e 66 6f 29 29 3b 0a 0a 20 20 69 66 28 20 49 67  nfo));..  if( Ig
21b20 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
21b30 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73  Dest) ){.    ass
21b40 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74  ert(pDest->eDest
21b50 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20  ==SRT_Exists || 
21b60 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
21b70 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20  T_Union || .    
21b80 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
21b90 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20  est==SRT_Except 
21ba0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
21bb0 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a 20  =SRT_Discard);. 
21bc0 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
21bd0 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
21be0 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
21bf0 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
21c00 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
21c10 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
21c20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
21c30 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
21c40 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
21c50 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
21c60 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
21c70 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
21c80 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
21c90 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
21ca0 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
21cb0 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f  rse, p, 0);.  pO
21cc0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
21cd0 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74  erBy;.  pTabList
21ce0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
21cf0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
21d00 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
21d10 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
21d20 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
21d30 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
21d40 0a 20 20 7d 0a 20 20 69 73 41 67 67 20 3d 20 28  .  }.  isAgg = (
21d50 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
21d60 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
21d70 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
21d80 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67  !=0 );..  /* Beg
21d90 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  in generating co
21da0 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  de..  */.  v = s
21db0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
21dc0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
21dd0 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
21de0 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72  end;..  /* If wr
21df0 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
21e00 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
21e10 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
21e20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
21e30 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
21e40 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
21e50 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
21e60 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
21e70 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
21e80 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
21e90 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
21ea0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
21eb0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
21ec0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
21ed0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
21ee0 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
21ef0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
21f00 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
21f10 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
21f20 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
21f30 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
21f40 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
21f50 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69   !p->pPrior && i
21f60 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
21f70 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
21f80 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
21f90 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
21fa0 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c  t->a[i];.    Sel
21fb0 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
21fc0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
21fd0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b   pItem->pSelect;
21fe0 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67 53 75  .    int isAggSu
21ff0 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62  b;..    if( pSub
22000 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
22010 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65  .    /* Sometime
22020 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
22030 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62   subquery will b
22040 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65  e generated more
22050 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63   than.    ** onc
22060 65 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65  e, if the subque
22070 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ry is part of th
22080 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
22090 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20  n a LEFT JOIN,. 
220a0 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c     ** for exampl
220b0 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
220c0 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72  , do not regener
220d0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
220e0 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20  manifest.    ** 
220f0 61 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f  a view or the co
22100 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c  -routine to impl
22110 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54  ement a view.  T
22120 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
22130 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66  e.    ** is suff
22140 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74  icient, though t
22150 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  he subroutine to
22160 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69   manifest the vi
22170 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20  ew does need.   
22180 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65   ** to be invoke
22190 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20  d again. */.    
221a0 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  if( pItem->addrF
221b0 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20  illSub ){.      
221c0 69 66 28 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f  if( pItem->viaCo
221d0 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20  routine==0 ){.  
221e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
221f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
22200 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  sub, pItem->regR
22210 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64  eturn, pItem->ad
22220 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
22230 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e    }.      contin
22240 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
22250 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73  * Increment Pars
22260 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65  e.nHeight by the
22270 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c   height of the l
22280 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f  argest expressio
22290 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65  n.    ** tree re
222a0 66 65 72 65 64 20 74 6f 20 62 79 20 74 68 69 73  fered to by this
222b0 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c  , the parent sel
222c0 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73  ect. The child s
222d0 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79  elect.    ** may
222e0 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73   contain express
222f0 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20  ion trees of at 
22300 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c  most.    ** (SQL
22310 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
22320 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74  TH-Parse.nHeight
22330 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69  ) height. This i
22340 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d  s a bit.    ** m
22350 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ore conservative
22360 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c   than necessary,
22370 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72   but much easier
22380 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a   than enforcing.
22390 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20      ** an exact 
223a0 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  limit..    */.  
223b0 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
223c0 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t += sqlite3Sele
223d0 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
223e0 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d  ..    isAggSub =
223f0 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
22400 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
22410 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  !=0;.    if( fla
22420 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
22430 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
22440 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20  , isAggSub) ){. 
22450 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62       /* This sub
22460 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73  query can be abs
22470 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70  orbed into its p
22480 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
22490 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a  if( isAggSub ){.
224a0 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d 20          isAgg = 
224b0 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  1;.        p->se
224c0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67  lFlags |= SF_Agg
224d0 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a  regate;.      }.
224e0 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20        i = -1;.  
224f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
22500 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 26 26  List->nSrc==1 &&
22510 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
22520 53 46 5f 4d 61 74 65 72 69 61 6c 69 7a 65 29 3d  SF_Materialize)=
22530 3d 30 0a 20 20 20 20 20 20 26 26 20 4f 70 74 69  =0.      && Opti
22540 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
22550 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43  db, SQLITE_SubqC
22560 6f 72 6f 75 74 69 6e 65 29 0a 20 20 20 20 29 7b  oroutine).    ){
22570 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d  .      /* Implem
22580 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  ent a co-routine
22590 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72   that will retur
225a0 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  n a single row o
225b0 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
225c0 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63     ** set on eac
225d0 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20  h invocation..  
225e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
225f0 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20   addrTop;.      
22600 69 6e 74 20 61 64 64 72 45 6f 66 3b 0a 20 20 20  int addrEof;.   
22610 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
22620 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
22630 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
22640 45 6f 66 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Eof = ++pParse->
22650 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 2f 2a 20 42  nMem;.      /* B
22660 65 66 6f 72 65 20 63 6f 64 69 6e 67 20 74 68 65  efore coding the
22670 20 4f 50 5f 47 6f 74 6f 20 74 6f 20 6a 75 6d 70   OP_Goto to jump
22680 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
22690 20 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e   the main routin
226a0 65 2c 0a 20 20 20 20 20 20 2a 2a 20 65 6e 73 75  e,.      ** ensu
226b0 72 65 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70  re that the jump
226c0 20 74 6f 20 74 68 65 20 76 65 72 69 66 79 2d 73   to the verify-s
226d0 63 68 65 6d 61 20 72 6f 75 74 69 6e 65 20 68 61  chema routine ha
226e0 73 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  s already.      
226f0 2a 2a 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 4f  ** been coded. O
22700 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 76 65  therwise, the ve
22710 72 69 66 79 2d 73 63 68 65 6d 61 20 77 6f 75 6c  rify-schema woul
22720 64 20 6c 69 6b 65 6c 79 20 62 65 20 63 6f 64 65  d likely be code
22730 64 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 70  d as .      ** p
22740 61 72 74 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f  art of the co-ro
22750 75 74 69 6e 65 2e 20 49 66 20 74 68 65 20 6d 61  utine. If the ma
22760 69 6e 20 72 6f 75 74 69 6e 65 20 74 68 65 6e 20  in routine then 
22770 61 63 63 65 73 73 65 64 20 74 68 65 20 0a 20 20  accessed the .  
22780 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
22790 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67 20  before invoking 
227a0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 66  the co-routine f
227b0 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  or the first tim
227c0 65 20 28 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a  e (for .      **
227d0 20 65 78 61 6d 70 6c 65 20 74 6f 20 69 6e 69 74   example to init
227e0 69 61 6c 69 7a 65 20 61 20 4c 49 4d 49 54 20 72  ialize a LIMIT r
227f0 65 67 69 73 74 65 72 20 66 72 6f 6d 20 61 20 73  egister from a s
22800 75 62 2d 73 65 6c 65 63 74 29 2c 20 69 74 20 77  ub-select), it w
22810 6f 75 6c 64 20 0a 20 20 20 20 20 20 2a 2a 20 62  ould .      ** b
22820 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 74 68 6f  e doing so witho
22830 75 74 20 68 61 76 69 6e 67 20 76 65 72 69 66 69  ut having verifi
22840 65 64 20 74 68 65 20 73 63 68 65 6d 61 20 76 65  ed the schema ve
22850 72 73 69 6f 6e 20 61 6e 64 20 6f 62 74 61 69 6e  rsion and obtain
22860 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ed .      ** the
22870 20 72 65 71 75 69 72 65 64 20 64 62 20 6c 6f 63   required db loc
22880 6b 73 2e 20 53 65 65 20 74 69 63 6b 65 74 20 64  ks. See ticket d
22890 36 62 33 36 62 65 33 38 2e 20 20 2a 2f 0a 20 20  6b36be38.  */.  
228a0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
228b0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
228c0 73 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73  se, -1);.      s
228d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
228e0 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
228f0 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
22900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
22910 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
22920 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
22930 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22940 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
22950 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
22960 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6f 72 6f 75  mment((v, "corou
22970 74 69 6e 65 20 66 6f 72 20 25 73 22 2c 20 70 49  tine for %s", pI
22980 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
22990 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ));.      pItem-
229a0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61  >addrFillSub = a
229b0 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71  ddrTop;.      sq
229c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
229d0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
229e0 2c 20 61 64 64 72 45 6f 66 29 3b 0a 20 20 20 20  , addrEof);.    
229f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
22a00 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 20  ngeP5(v, 1);.   
22a10 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
22a20 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
22a30 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
22a40 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
22a50 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
22a60 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
22a70 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
22a80 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
22a90 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
22aa0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
22ab0 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
22ac0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
22ad0 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28  Tab->nRowEst = (
22ae0 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e  unsigned)pSub->n
22af0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
22b00 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75   pItem->viaCorou
22b10 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tine = 1;.      
22b20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
22b30 65 50 32 28 76 2c 20 61 64 64 72 54 6f 70 2c 20  eP2(v, addrTop, 
22b40 64 65 73 74 2e 69 53 64 73 74 29 3b 0a 20 20 20  dest.iSdst);.   
22b50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
22b60 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 54 6f  angeP3(v, addrTo
22b70 70 2c 20 64 65 73 74 2e 6e 53 64 73 74 29 3b 0a  p, dest.nSdst);.
22b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22b90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
22ba0 74 65 67 65 72 2c 20 31 2c 20 61 64 64 72 45 6f  teger, 1, addrEo
22bb0 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
22bc0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
22bd0 50 5f 59 69 65 6c 64 2c 20 70 49 74 65 6d 2d 3e  P_Yield, pItem->
22be0 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
22bf0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
22c00 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65  , "end %s", pIte
22c10 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
22c20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22c30 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
22c40 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  ddrTop-1);.     
22c50 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
22c60 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
22c70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
22c80 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
22c90 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
22ca0 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65  t will fill an e
22cb0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
22cc0 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ith.      ** the
22cd0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
22ce0 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65   subquery.  pIte
22cf0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77  m->addrFillSub w
22d00 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20  ill point.      
22d10 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73  ** to the addres
22d20 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74  s of the generat
22d30 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ed subroutine.  
22d40 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
22d50 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72  .      ** is a r
22d60 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65  egister allocate
22d70 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75  d to hold the su
22d80 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
22d90 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f  address.      */
22da0 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64  .      int topAd
22db0 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e  dr;.      int on
22dc0 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  ceAddr = 0;.    
22dd0 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20    int retAddr;. 
22de0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
22df0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d  em->addrFillSub=
22e00 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65  =0 );.      pIte
22e10 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
22e20 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
22e30 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73       topAddr = s
22e40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22e50 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
22e60 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  0, pItem->regRet
22e70 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65  urn);.      pIte
22e80 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
22e90 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20   topAddr+1;.    
22ea0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
22eb0 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
22ec0 7a 65 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  ze %s", pItem->p
22ed0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
22ee0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
22ef0 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29  sCorrelated==0 )
22f00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
22f10 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
22f20 6e 6f 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e  no correlated an
22f30 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  d if we are not 
22f40 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20  inside of.      
22f50 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20    ** a trigger, 
22f60 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65  then we only nee
22f70 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
22f80 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75   value of the su
22f90 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a  bquery.        *
22fa0 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20  * once. */.     
22fb0 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71     onceAddr = sq
22fc0 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
22fd0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
22fe0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
22ff0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
23000 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20  , SRT_EphemTab, 
23010 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
23020 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
23030 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
23040 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70  iSelectId, (u8)p
23050 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
23060 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ctId);.      sql
23070 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
23080 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
23090 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
230a0 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75  ab->nRowEst = (u
230b0 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53  nsigned)pSub->nS
230c0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
230d0 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73  if( onceAddr ) s
230e0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
230f0 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b  re(v, onceAddr);
23100 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d  .      retAddr =
23110 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23120 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
23130 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
23140 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  n);.      VdbeCo
23150 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25  mment((v, "end %
23160 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
23170 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
23180 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
23190 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20  eP1(v, topAddr, 
231a0 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20  retAddr);.      
231b0 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
231c0 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
231d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
231e0 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  /*pParse->nErr |
231f0 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  |*/ db->mallocFa
23200 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67 6f  iled ){.      go
23210 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
23220 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
23230 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69  >nHeight -= sqli
23240 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
23250 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61 62  ght(p);.    pTab
23260 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
23270 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62      if( !Ignorab
23280 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
23290 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72   ){.      pOrder
232a0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
232b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  ;.    }.  }.  pE
232c0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
232d0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65 72  ;.#endif.  pWher
232e0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
232f0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
23300 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
23310 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
23320 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  .  sDistinct.isT
23330 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  nct = (p->selFla
23340 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
23350 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53  )!=0;..#ifndef S
23360 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
23370 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
23380 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20  If there is are 
23390 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75  a sequence of qu
233a0 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61  eries, do the ea
233b0 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74  rlier ones first
233c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
233d0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
233e0 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ( p->pRightmost=
233f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  =0 ){.      Sele
23400 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67  ct *pLoop, *pRig
23410 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ht = 0;.      in
23420 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  t cnt = 0;.     
23430 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a 20   int mxSelect;. 
23440 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70       for(pLoop=p
23450 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
23460 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e  Loop->pPrior, cn
23470 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t++){.        pL
23480 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  oop->pRightmost 
23490 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  = p;.        pLo
234a0 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67  op->pNext = pRig
234b0 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67  ht;.        pRig
234c0 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  ht = pLoop;.    
234d0 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c 65    }.      mxSele
234e0 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  ct = db->aLimit[
234f0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
23500 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a 20  POUND_SELECT];. 
23510 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65 63       if( mxSelec
23520 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65 63  t && cnt>mxSelec
23530 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
23540 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23550 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74  rse, "too many t
23560 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64  erms in compound
23570 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20   SELECT");.     
23580 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
23590 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
235a0 7d 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  }.    rc = multi
235b0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
235c0 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78  , pDest);.    ex
235d0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
235e0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
235f0 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
23600 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  tId);.    return
23610 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
23620 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
23630 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42  s both a GROUP B
23640 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42  Y and an ORDER B
23650 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  Y clause and the
23660 79 20 61 72 65 0a 20 20 2a 2a 20 69 64 65 6e 74  y are.  ** ident
23670 69 63 61 6c 2c 20 74 68 65 6e 20 64 69 73 61 62  ical, then disab
23680 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  le the ORDER BY 
23690 63 6c 61 75 73 65 20 73 69 6e 63 65 20 74 68 65  clause since the
236a0 20 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a 20 77   GROUP BY.  ** w
236b0 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e  ill cause elemen
236c0 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 69  ts to come out i
236d0 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72  n the correct or
236e0 64 65 72 2e 20 20 54 68 69 73 20 69 73 0a 20 20  der.  This is.  
236f0 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  ** an optimizati
23700 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74  on - the correct
23710 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72   answer should r
23720 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73  esult regardless
23730 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53  ..  ** Use the S
23740 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
23750 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c  er flag with SQL
23760 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
23770 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f 20 64  IMIZER.  ** to d
23780 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  isable this opti
23790 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73  mization for tes
237a0 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 20  ting purposes.. 
237b0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
237c0 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
237d0 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 4f  (p->pGroupBy, pO
237e0 72 64 65 72 42 79 29 3d 3d 30 0a 20 20 20 20 20  rderBy)==0.     
237f0 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
23800 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
23810 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
23820 65 72 29 20 29 7b 0a 20 20 20 20 70 4f 72 64 65  er) ){.    pOrde
23830 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
23840 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
23850 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68  is DISTINCT with
23860 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74   an ORDER BY but
23870 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
23880 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20  gate, and .  ** 
23890 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69  if the select-li
238a0 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  st is the same a
238b0 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c  s the ORDER BY l
238c0 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71  ist, then this q
238d0 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65  uery.  ** can be
238e0 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
238f0 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68  GROUP BY. In oth
23900 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a  er words, this:.
23910 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
23920 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79  LECT DISTINCT xy
23930 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52  z FROM ... ORDER
23940 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
23950 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  * is transformed
23960 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
23970 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52     SELECT xyz FR
23980 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20  OM ... GROUP BY 
23990 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  xyz.  **.  ** Th
239a0 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73  e second form is
239b0 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20   preferred as a 
239c0 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72  single index (or
239d0 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79   temp-table) may
239e0 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66   be .  ** used f
239f0 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45  or both the ORDE
23a00 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  R BY and DISTINC
23a10 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73  T processing. As
23a20 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a   originally .  *
23a30 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75  * written the qu
23a40 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74  ery must use a t
23a50 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74  emp-table for at
23a60 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
23a70 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59  e ORDER .  ** BY
23a80 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61   and DISTINCT, a
23a90 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73  nd an index or s
23aa0 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62  eparate temp-tab
23ab0 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  le for the other
23ac0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  ..  */.  if( (p-
23ad0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
23ae0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
23af0 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
23b00 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69  inct .   && sqli
23b10 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
23b20 72 65 28 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e  re(pOrderBy, p->
23b30 70 45 4c 69 73 74 29 3d 3d 30 0a 20 20 29 7b 0a  pEList)==0.  ){.
23b40 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
23b50 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
23b60 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
23b70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
23b80 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
23b90 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72  ist, 0);.    pGr
23ba0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
23bb0 70 42 79 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  pBy;.    pOrderB
23bc0 79 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 6f  y = 0;.    /* No
23bd0 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74  tice that even t
23be0 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e  hought SF_Distin
23bf0 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  ct has been clea
23c00 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46  red from p->selF
23c10 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65  lags,.    ** the
23c20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
23c30 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20  t is still set. 
23c40 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72   Hence, isTnct r
23c50 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20  epresents the.  
23c60 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65    ** original se
23c70 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f  tting of the SF_
23c80 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e  Distinct flag, n
23c90 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ot the current s
23ca0 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73  etting */.    as
23cb0 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e  sert( sDistinct.
23cc0 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a 20  isTnct );.  }.. 
23cd0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
23ce0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
23cf0 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f  se, then this so
23d00 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78  rting.  ** index
23d10 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
23d20 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68  ing unused if th
23d30 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20  e data can be . 
23d40 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e   ** extracted in
23d50 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
23d60 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  r.  If that is t
23d70 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
23d80 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70  e.  ** OP_OpenEp
23d90 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
23da0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ion will be chan
23db0 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  ged to an OP_Noo
23dc0 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66  p once.  ** we f
23dd0 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
23de0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
23df0 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20   is not needed. 
23e00 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64   The addrSortInd
23e10 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  ex.  ** variable
23e20 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69   is used to faci
23e30 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61 6e  litate that chan
23e40 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ge..  */.  if( p
23e50 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
23e60 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
23e70 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
23e80 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
23e90 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72  List(pParse, pOr
23ea0 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64  derBy);.    pOrd
23eb0 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d  erBy->iECursor =
23ec0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
23ed0 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
23ee0 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f  Ephm[2] = addrSo
23ef0 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20  rtIndex =.      
23f00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23f10 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
23f20 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  meral,.         
23f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f40 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
23f50 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e  rsor, pOrderBy->
23f60 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20  nExpr+2, 0,.    
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f80 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
23f90 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
23fa0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d  FO_HANDOFF);.  }
23fb0 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f  else{.    addrSo
23fc0 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  rtIndex = -1;.  
23fd0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  }..  /* If the o
23fe0 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
23ff0 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
24000 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
24010 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
24020 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
24030 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
24040 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
24050 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
24060 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44  penEphemeral, pD
24070 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45  est->iSDParm, pE
24080 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
24090 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
240a0 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
240b0 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
240c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
240d0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
240e0 3d 20 28 64 6f 75 62 6c 65 29 4c 41 52 47 45 53  = (double)LARGES
240f0 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75  T_INT64;.  compu
24100 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
24110 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64  (pParse, p, iEnd
24120 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
24130 69 74 3d 3d 30 20 26 26 20 61 64 64 72 53 6f 72  it==0 && addrSor
24140 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20  tIndex>=0 ){.   
24150 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
24160 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  p(v, addrSortInd
24170 65 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  ex)->opcode = OP
24180 5f 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20 20  _SorterOpen;.   
24190 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
241a0 53 46 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20  SF_UseSorter;.  
241b0 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76  }..  /* Open a v
241c0 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20  irtual index to 
241d0 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
241e0 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  inct set..  */. 
241f0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
24200 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
24210 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
24220 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65  tabTnct = pParse
24230 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44  ->nTab++;.    sD
24240 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74  istinct.addrTnct
24250 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
24260 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
24270 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
24280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24290 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69            sDisti
242a0 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20  nct.tabTnct, 0, 
242b0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
242c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242d0 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66     (char*)keyInf
242e0 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
242f0 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29  arse, p->pEList)
24300 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24320 20 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e    P4_KEYINFO_HAN
24330 44 4f 46 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  DOFF);.    sqlit
24340 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
24350 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
24360 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  D);.    sDistinc
24370 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48  t.eTnctType = WH
24380 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
24390 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b  RDERED;.  }else{
243a0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
243b0 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
243c0 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a  _DISTINCT_NOOP;.
243d0 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67    }..  if( !isAg
243e0 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30  g && pGroupBy==0
243f0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67   ){.    /* No ag
24400 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
24410 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42  s and no GROUP B
24420 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  Y clause */.    
24430 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 20  ExprList *pDist 
24440 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54  = (sDistinct.isT
24450 6e 63 74 20 3f 20 70 2d 3e 70 45 4c 69 73 74 20  nct ? p->pEList 
24460 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65  : 0);..    /* Be
24470 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
24480 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57   scan. */.    pW
24490 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
244a0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
244b0 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
244c0 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 44 69  e, pOrderBy, pDi
244d0 73 74 2c 20 30 2c 30 29 3b 0a 20 20 20 20 69 66  st, 0,0);.    if
244e0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
244f0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
24500 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
24510 52 6f 77 4f 75 74 20 3c 20 70 2d 3e 6e 53 65 6c  RowOut < p->nSel
24520 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c  ectRow ) p->nSel
24530 65 63 74 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d  ectRow = pWInfo-
24540 3e 6e 52 6f 77 4f 75 74 3b 0a 20 20 20 20 69 66  >nRowOut;.    if
24550 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  ( pWInfo->eDisti
24560 6e 63 74 20 29 20 73 44 69 73 74 69 6e 63 74 2e  nct ) sDistinct.
24570 65 54 6e 63 74 54 79 70 65 20 3d 20 70 57 49 6e  eTnctType = pWIn
24580 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3b 0a 20  fo->eDistinct;. 
24590 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
245a0 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  && pWInfo->nOBSa
245b0 74 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t==pOrderBy->nEx
245c0 70 72 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20  pr ) pOrderBy = 
245d0 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f  0;..    /* If so
245e0 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
245f0 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
24600 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45  a prior OP_OpenE
24610 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a  phemeral .    **
24620 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64   instruction end
24630 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20  ed up not being 
24640 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61  needed, then cha
24650 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45  nge the OP_OpenE
24660 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20  phemeral.    ** 
24670 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
24680 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
24690 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
246a0 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20   && pOrderBy==0 
246b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
246c0 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
246d0 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
246e0 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  x);.      p->add
246f0 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d  rOpenEphm[2] = -
24700 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
24710 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   Use the standar
24720 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f  d inner loop. */
24730 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  .    selectInner
24740 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
24750 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
24760 72 64 65 72 42 79 2c 20 26 73 44 69 73 74 69 6e  rderBy, &sDistin
24770 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20  ct, pDest,.     
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
24790 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
247a0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
247b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74  );..    /* End t
247c0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
247d0 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
247e0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
247f0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c  d(pWInfo);.  }el
24800 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
24810 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20  case when there 
24820 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20  exist aggregate 
24830 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47  functions or a G
24840 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20  ROUP BY clause. 
24850 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f     ** or both */
24860 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
24870 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65   sNC;    /* Name
24880 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f   context for pro
24890 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
248a0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
248b0 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20  .    int iAMem; 
248c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
248d0 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
248e0 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e  r storing curren
248f0 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  t GROUP BY */.  
24900 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20    int iBMem;    
24910 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
24920 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70  em address for p
24930 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59  revious GROUP BY
24940 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65   */.    int iUse
24950 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Flag;       /* M
24960 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69  em address holdi
24970 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69  ng flag indicati
24980 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  ng that at least
24990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
249a0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20           ** one 
249b0 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74  row of the input
249c0 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
249d0 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  or has been.    
249e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249f0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
24a00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f   */.    int iAbo
24a10 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d  rtFlag;     /* M
24a20 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68  em address which
24a30 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62   causes query ab
24a40 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20  ort if positive 
24a50 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70  */.    int group
24a60 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f  BySort;    /* Ro
24a70 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75  ws come from sou
24a80 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20  rce in GROUP BY 
24a90 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  order */.    int
24aa0 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20   addrEnd;       
24ab0 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65   /* End of proce
24ac0 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53  ssing for this S
24ad0 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74  ELECT */.    int
24ae0 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20   sortPTab = 0;  
24af0 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20   /* Pseudotable 
24b00 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73  used to decode s
24b10 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  orting results *
24b20 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75  /.    int sortOu
24b30 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74  t = 0;    /* Out
24b40 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f  put register fro
24b50 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a  m the sorter */.
24b60 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  .    /* Remove a
24b70 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73  ny and all alias
24b80 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72  es between the r
24b90 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68  esult set and th
24ba0 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42  e.    ** GROUP B
24bb0 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
24bc0 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
24bd0 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  y ){.      int k
24be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
24c00 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
24c10 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
24c20 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
24c30 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
24c40 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ver expression i
24c50 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20  n a list */..   
24c60 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69     for(k=p->pELi
24c70 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
24c80 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b  =p->pEList->a; k
24c90 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
24ca0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
24cb0 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->iAlias = 0;.  
24cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
24cd0 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
24ce0 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
24cf0 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
24d00 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
24d10 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20    pItem->iAlias 
24d20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
24d30 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
24d40 74 52 6f 77 3e 28 64 6f 75 62 6c 65 29 31 30 30  tRow>(double)100
24d50 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
24d60 20 3d 20 28 64 6f 75 62 6c 65 29 31 30 30 3b 0a   = (double)100;.
24d70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24d80 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
24d90 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20 20 20 20   (double)1;.    
24da0 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  }.. .    /* Crea
24db0 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
24dc0 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
24dd0 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
24de0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
24df0 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
24e00 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
24e10 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
24e20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
24e30 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
24e40 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
24e50 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
24e60 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
24e70 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
24e80 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
24e90 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
24ea0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
24eb0 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
24ec0 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
24ed0 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
24ee0 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
24ef0 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
24f00 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
24f10 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
24f20 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
24f30 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53  .    sAggInfo.nS
24f40 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70  ortingColumn = p
24f50 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70  GroupBy ? pGroup
24f60 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b  By->nExpr+1 : 0;
24f70 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47  .    sAggInfo.pG
24f80 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
24f90 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  y;.    sqlite3Ex
24fa0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
24fb0 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a  (&sNC, pEList);.
24fc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
24fd0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
24fe0 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  NC, pOrderBy);. 
24ff0 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
25000 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
25010 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
25020 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69  ates(&sNC, pHavi
25030 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ng);.    }.    s
25040 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c  AggInfo.nAccumul
25050 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e  ator = sAggInfo.
25060 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72  nColumn;.    for
25070 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
25080 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  .nFunc; i++){.  
25090 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
250a0 72 48 61 73 50 72 6f 70 65 72 74 79 28 73 41 67  rHasProperty(sAg
250b0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
250c0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
250d0 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
250e0 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49  .ncFlags |= NC_I
250f0 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20  nAggFunc;.      
25100 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
25110 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
25120 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
25130 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ].pExpr->x.pList
25140 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46  );.      sNC.ncF
25150 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67  lags &= ~NC_InAg
25160 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20  gFunc;.    }.   
25170 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
25180 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
25190 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
251a0 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   Processing for 
251b0 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20  aggregates with 
251c0 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79  GROUP BY is very
251d0 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20   different and. 
251e0 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20     ** much more 
251f0 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67  complex than agg
25200 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20  regates without 
25210 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20  a GROUP BY..    
25220 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
25230 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  pBy ){.      Key
25240 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
25250 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72   /* Keying infor
25260 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67  mation for the g
25270 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
25280 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20  /.      int j1; 
25290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
252a0 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f  -vs-B comparisio
252b0 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20  n jump */.      
252c0 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f  int addrOutputRo
252d0 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  w;  /* Start of 
252e0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
252f0 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74  outputs a result
25300 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e   row */.      in
25310 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20  t regOutputRow; 
25320 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
25330 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
25340 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
25350 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
25360 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20  addrSetAbort;   
25370 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74  /* Set the abort
25380 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e   flag and return
25390 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
253a0 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a  drTopOfLoop;  /*
253b0 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75   Top of the inpu
253c0 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  t loop */.      
253d0 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49  int addrSortingI
253e0 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70  dx; /* The OP_Op
253f0 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20  enEphemeral for 
25400 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
25410 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  x */.      int a
25420 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  ddrReset;      /
25430 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  * Subroutine for
25440 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61   resetting the a
25450 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20  ccumulator */.  
25460 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74      int regReset
25470 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  ;       /* Retur
25480 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
25490 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62  er for reset sub
254a0 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20  routine */..    
254b0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
254c0 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
254d0 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64  se we might need
254e0 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
254f0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   to.      ** imp
25500 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f  lement it.  Allo
25510 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e  cate that sortin
25520 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66  g index now.  If
25530 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20   it turns out.  
25540 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
25550 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66  o not need it af
25560 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f  ter all, the OP_
25570 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72  SorterOpen instr
25580 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  uction.      ** 
25590 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
255a0 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20  d into a Noop.  
255b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
255c0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
255d0 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
255e0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79  ab++;.      pKey
255f0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
25600 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
25610 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  e, pGroupBy);.  
25620 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49      addrSortingI
25630 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dx = sqlite3Vdbe
25640 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72  AddOp4(v, OP_Sor
25650 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20  terOpen, .      
25660 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
25670 74 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66  tingIdx, sAggInf
25680 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
25690 2c 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  , .          0, 
256a0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
256b0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
256c0 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  OFF);..      /* 
256d0 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
256e0 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
256f0 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
25700 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
25710 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
25720 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50   iUseFlag = ++pP
25730 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
25740 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b    iAbortFlag = +
25750 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
25760 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f       regOutputRo
25770 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  w = ++pParse->nM
25780 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  em;.      addrOu
25790 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
257a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
257b0 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65  );.      regRese
257c0 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
257d0 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65  em;.      addrRe
257e0 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
257f0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
25800 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61       iAMem = pPa
25810 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
25820 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
25830 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
25840 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
25850 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
25860 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
25870 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
25880 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
25890 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
258a0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
258b0 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61  er, 0, iAbortFla
258c0 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
258d0 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72  mment((v, "clear
258e0 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
258f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25900 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
25910 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c  teger, 0, iUseFl
25920 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
25930 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
25940 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  cate accumulator
25950 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20   empty"));.     
25960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
25970 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
25980 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70  , iAMem, iAMem+p
25990 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31  GroupBy->nExpr-1
259a0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67  );..      /* Beg
259b0 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  in a loop that w
259c0 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20  ill extract all 
259d0 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47  source rows in G
259e0 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20  ROUP BY order.. 
259f0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
25a00 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73  ht involve two s
25a10 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69  eparate loops wi
25a20 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e  th an OP_Sort in
25a30 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20   between, or.   
25a40 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
25a50 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20  e a single loop 
25a60 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64  that uses an ind
25a70 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e  ex to extract in
25a80 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20  formation.      
25a90 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  ** in the right 
25aa0 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77  order to begin w
25ab0 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ith..      */.  
25ac0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25ad0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
25ae0 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
25af0 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70  rReset);.      p
25b00 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
25b10 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
25b20 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
25b30 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c  re, pGroupBy, 0,
25b40 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
25b50 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
25b60 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
25b70 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
25b80 3e 6e 4f 42 53 61 74 3d 3d 70 47 72 6f 75 70 42  >nOBSat==pGroupB
25b90 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
25ba0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d      /* The optim
25bb0 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20  izer is able to 
25bc0 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
25bd0 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73  group by order s
25be0 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20  o.        ** we 
25bf0 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73  do not have to s
25c00 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65  ort.  The OP_Ope
25c10 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65  nEphemeral table
25c20 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
25c30 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61   ** cancelled la
25c40 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73  ter because we s
25c50 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65  till need to use
25c60 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20   the pKeyInfo.  
25c70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
25c80 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30   groupBySort = 0
25c90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25ca0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61         /* Rows a
25cb0 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e  re coming out in
25cc0 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72   undetermined or
25cd0 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  der.  We have to
25ce0 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a   push.        **
25cf0 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61   each row into a
25d00 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20   sorting index, 
25d10 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69  terminate the fi
25d20 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20  rst loop,.      
25d30 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f    ** then loop o
25d40 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  ver the sorting 
25d50 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74  index in order t
25d60 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74  o get the output
25d70 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73  .        ** in s
25d80 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20  orted order.    
25d90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
25da0 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20  nt regBase;.    
25db0 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72      int regRecor
25dc0 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
25dd0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Col;.        int
25de0 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20   nGroupBy;..    
25df0 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
25e00 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20  able(pParse, .  
25e10 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74            (sDist
25e20 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28  inct.isTnct && (
25e30 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44  p->selFlags&SF_D
25e40 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20  istinct)==0) ?. 
25e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e60 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20     "DISTINCT" : 
25e70 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20  "GROUP BY");..  
25e80 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
25e90 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e  t = 1;.        n
25ea0 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
25eb0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
25ec0 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70     nCol = nGroup
25ed0 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  By + 1;.        
25ee0 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a  j = nGroupBy+1;.
25ef0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
25f00 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
25f10 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
25f20 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66       if( sAggInf
25f30 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65  o.aCol[i].iSorte
25f40 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
25f50 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b            nCol++
25f60 3b 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 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
25fa0 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
25fb0 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Parse, nCol);.  
25fc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25fd0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
25fe0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
25ff0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
26000 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
26010 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20  oupBy, regBase, 
26020 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
26030 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
26040 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41   OP_Sequence, sA
26050 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
26060 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f 75 70  x,regBase+nGroup
26070 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  By);.        j =
26080 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20   nGroupBy+1;.   
26090 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
260a0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
260b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
260c0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
260d0 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41  _col *pCol = &sA
260e0 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a  ggInfo.aCol[i];.
260f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
26100 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
26110 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
26120 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b      int r1 = j +
26130 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
26140 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20        int r2;.. 
26150 20 20 20 20 20 20 20 20 20 20 20 72 32 20 3d 20             r2 = 
26160 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
26170 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
26180 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
26190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261a0 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f   pCol->pTab, pCo
261b0 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c  l->iColumn, pCol
261c0 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20 30 29  ->iTable, r1, 0)
261d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
261e0 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20  ( r1!=r2 ){.    
261f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26200 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
26210 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29  P_SCopy, r2, r1)
26220 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
26230 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
26240 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
26260 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
26270 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
26280 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
26290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
262a0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
262b0 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c  , regBase, nCol,
262c0 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
262d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
262e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
262f0 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49  terInsert, sAggI
26300 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
26310 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
26320 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
26330 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
26340 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
26350 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
26360 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
26370 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
26380 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
26390 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
263a0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
263b0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
263c0 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61  dxPTab = sortPTa
263d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
263e0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74  ++;.        sort
263f0 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Out = sqlite3Get
26400 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
26410 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26420 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
26430 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72  _OpenPseudo, sor
26440 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20  tPTab, sortOut, 
26450 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  nCol);.        s
26460 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26470 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
26480 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
26490 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29  ingIdx, addrEnd)
264a0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
264b0 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50  mment((v, "GROUP
264c0 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20 20 20   BY sort"));.   
264d0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73       sAggInfo.us
264e0 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b  eSortingIdx = 1;
264f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26500 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
26510 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
26520 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61  .      /* Evalua
26530 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  te the current G
26540 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e  ROUP BY terms an
26550 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62  d store in b0, b
26560 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, b2....      *
26570 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20  * (b0 is memory 
26580 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30  location iBMem+0
26590 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c  , b1 is iBMem+1,
265a0 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20   and so forth). 
265b0 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d       ** Then com
265c0 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  pare the current
265d0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
265e0 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55  against the GROU
265f0 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20  P BY terms.     
26600 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65   ** from the pre
26610 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e  vious row curren
26620 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30  tly stored in a0
26630 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20  , a1, a2....    
26640 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54    */.      addrT
26650 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  opOfLoop = sqlit
26660 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
26670 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
26680 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
26690 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
266a0 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
266b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
266c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
266d0 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
266e0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
266f0 49 64 78 2c 20 73 6f 72 74 4f 75 74 29 3b 0a 20  Idx, sortOut);. 
26700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
26710 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
26720 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
26730 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70         if( group
26740 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
26750 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26760 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
26770 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c  mn, sortPTab, j,
26780 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
26790 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20       if( j==0 ) 
267a0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
267b0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c  eP5(v, OPFLAG_CL
267c0 45 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20  EARCACHE);.     
267d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
267e0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72      sAggInfo.dir
267f0 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ectMode = 1;.   
26800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
26810 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
26820 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45  GroupBy->a[j].pE
26830 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  xpr, iBMem+j);. 
26840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
26850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26860 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
26870 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69  ompare, iAMem, i
26880 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  BMem, pGroupBy->
26890 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
268a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268b0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
268c0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
268d0 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65       j1 = sqlite
268e0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
268f0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
26900 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
26910 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30  OP_Jump, j1+1, 0
26920 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20  , j1+1);..      
26930 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
26940 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65   that runs whene
26950 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  ver the GROUP BY
26960 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20   changes..      
26970 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68  ** Changes in th
26980 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64  e GROUP BY are d
26990 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70  etected by the p
269a0 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20  revious code.   
269b0 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66     ** block.  If
269c0 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63   there were no c
269d0 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f  hanges, this blo
269e0 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  ck is skipped.. 
269f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
26a00 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65   This code copie
26a10 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20  s current group 
26a20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62  by terms in b0,b
26a30 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a  1,b2,....      *
26a40 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c  * over to a0,a1,
26a50 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c  a2.  It then cal
26a60 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  ls the output su
26a70 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
26a80 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65  * and resets the
26a90 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
26aa0 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
26ab0 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a   in preparation.
26ac0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
26ad0 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62   next GROUP BY b
26ae0 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atch..      */. 
26af0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26b00 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
26b10 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70   iBMem, iAMem, p
26b20 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b  GroupBy->nExpr);
26b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26b40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
26b50 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
26b60 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
26b70 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
26b80 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
26b90 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20  t one row"));.  
26ba0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26bb0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
26bc0 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61  s, iAbortFlag, a
26bd0 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56  ddrEnd);.      V
26be0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
26bf0 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
26c00 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
26c10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
26c20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
26c30 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
26c40 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
26c50 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63  t((v, "reset acc
26c60 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
26c70 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
26c80 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
26c90 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
26ca0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
26cb0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
26cc0 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
26cd0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
26ce0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
26cf0 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  j1);.      updat
26d00 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
26d10 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
26d20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26d30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
26d40 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46  nteger, 1, iUseF
26d50 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
26d60 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
26d70 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
26d80 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
26d90 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
26da0 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
26db0 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
26dc0 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
26dd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
26de0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
26df0 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
26e00 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
26e10 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
26e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26e30 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
26e40 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
26e50 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
26e60 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
26e70 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20  SortingIdx);.   
26e80 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
26e90 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20  utput the final 
26ea0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20  row of result.  
26eb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
26ec0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
26ed0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
26ee0 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
26ef0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
26f00 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
26f10 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f  "output final ro
26f20 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  w"));..      /* 
26f30 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75  Jump over the su
26f40 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20  broutines.      
26f50 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
26f60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
26f70 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e  _Goto, 0, addrEn
26f80 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  d);..      /* Ge
26f90 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
26fa0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
26fb0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
26fc0 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
26fd0 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20    ** set.  This 
26fe0 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74  subroutine first
26ff0 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55   looks at the iU
27000 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65  seFlag.  If iUse
27010 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  Flag.      ** is
27020 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
27030 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
27040 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61   subroutine is a
27050 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20   no-op.  If.    
27060 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
27070 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  ing calls for th
27080 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74  e query to abort
27090 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
270a0 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  e.      ** incre
270b0 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74  ments the iAbort
270c0 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  Flag memory loca
270d0 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tion before retu
270e0 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a  rning in.      *
270f0 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61  * order to signa
27100 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  l the caller to 
27110 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  abort..      */.
27120 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f        addrSetAbo
27130 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
27140 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
27150 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27160 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
27170 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74  teger, 1, iAbort
27180 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
27190 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
271a0 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  t abort flag"));
271b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
271c0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
271d0 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
271e0 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Row);.      sqli
271f0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
27200 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75  bel(v, addrOutpu
27210 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64  tRow);.      add
27220 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
27230 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
27240 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
27250 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
27260 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73  v, OP_IfPos, iUs
27270 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75  eFlag, addrOutpu
27280 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56  tRow+2);.      V
27290 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
272a0 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
272b0 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
272c0 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
272d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
272e0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
272f0 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
27300 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
27310 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
27320 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
27330 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
27340 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
27350 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75  aving, addrOutpu
27360 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a  tRow+1, SQLITE_J
27370 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
27380 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
27390 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
273a0 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
273b0 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
273c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
273d0 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
273e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
273f0 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75         addrOutpu
27400 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41  tRow+1, addrSetA
27410 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  bort);.      sql
27420 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
27430 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
27440 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
27450 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
27460 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72  , "end groupby r
27470 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
27480 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
27490 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
274a0 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
274b0 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
274c0 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
274d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
274e0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
274f0 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74  bel(v, addrReset
27500 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
27510 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
27520 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
27530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27540 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
27550 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20  rn, regReset);. 
27560 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e      .    } /* en
27570 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42  dif pGroupBy.  B
27580 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71  egin aggregate q
27590 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47  ueries without G
275a0 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20  ROUP BY: */.    
275b0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70  else {.      Exp
275c0 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b  rList *pDel = 0;
275d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
275e0 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
275f0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
27600 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  b;.      if( (pT
27610 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75  ab = isSimpleCou
27620 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29  nt(p, &sAggInfo)
27630 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
27640 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f  /* If isSimpleCo
27650 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20  unt() returns a 
27660 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62  pointer to a Tab
27670 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  le structure, th
27680 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
27690 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
276a0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
276b0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
276c0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63     **   SELECT c
276d0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
276e0 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  l>.        **.  
276f0 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74        ** where t
27700 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
27710 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72  re returned repr
27720 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62  esents table <tb
27730 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  l>..        **. 
27740 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73         ** This s
27750 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63  tatement is so c
27760 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73  ommon that it is
27770 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69   optimized speci
27780 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20  ally. The.      
27790 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e    ** OP_Count in
277a0 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65  struction is exe
277b0 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20  cuted either on 
277c0 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65  the intkey table
277d0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
277e0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
277f0 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62  ta for table <tb
27800 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20  l> or on one of 
27810 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a  its indexes. It.
27820 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65          ** is be
27830 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20  tter to execute 
27840 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64  the op on an ind
27850 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61  ex, as indexes a
27860 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20  re almost.      
27870 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65    ** always spre
27880 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70  ad across less p
27890 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20  ages than their 
278a0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
278b0 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bles..        */
278c0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
278d0 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
278e0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
278f0 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
27900 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
27910 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72    const int iCsr
27920 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
27930 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  +;     /* Cursor
27940 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20   to scan b-tree 
27950 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
27960 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
27970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27980 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
27990 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
279a0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
279b0 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
279c0 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20       /* Keyinfo 
279d0 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65  for scanned inde
279e0 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  x */.        Ind
279f0 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20  ex *pBest = 0;  
27a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a10 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20    /* Best index 
27a20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a  found so far */.
27a30 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f          int iRoo
27a40 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20  t = pTab->tnum; 
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27a60 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61  Root page of sca
27a70 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  nned b-tree */..
27a80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
27a90 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
27aa0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
27ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
27ac0 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
27ad0 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
27ae0 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
27af0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61  ..        /* Sea
27b00 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65  rch for the inde
27b10 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c  x that has the l
27b20 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f 66 20 63  east amount of c
27b30 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20 20 20 20 20  olumns. If.     
27b40 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 73     ** there is s
27b50 75 63 68 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e  uch an index, an
27b60 64 20 69 74 20 68 61 73 20 6c 65 73 73 20 63 6f  d it has less co
27b70 6c 75 6d 6e 73 20 74 68 61 6e 20 74 68 65 20 74  lumns than the t
27b80 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  able.        ** 
27b90 64 6f 65 73 2c 20 74 68 65 6e 20 77 65 20 63 61  does, then we ca
27ba0 6e 20 61 73 73 75 6d 65 20 74 68 61 74 20 69 74  n assume that it
27bb0 20 63 6f 6e 73 75 6d 65 73 20 6c 65 73 73 20 73   consumes less s
27bc0 70 61 63 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64  pace on disk and
27bd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  .        ** will
27be0 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 63 68   therefore be ch
27bf0 65 61 70 65 72 20 74 6f 20 73 63 61 6e 20 74 6f  eaper to scan to
27c00 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 71   determine the q
27c10 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 20 20 20  uery result..   
27c20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
27c30 63 61 73 65 20 73 65 74 20 69 52 6f 6f 74 20 74  case set iRoot t
27c40 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
27c50 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
27c60 64 65 78 20 62 2d 74 72 65 65 0a 20 20 20 20 20  dex b-tree.     
27c70 20 20 20 2a 2a 20 61 6e 64 20 70 4b 65 79 49 6e     ** and pKeyIn
27c80 66 6f 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66  fo to the KeyInf
27c90 6f 20 73 74 72 75 63 74 75 72 65 20 72 65 71 75  o structure requ
27ca0 69 72 65 64 20 74 6f 20 6e 61 76 69 67 61 74 65  ired to navigate
27cb0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
27cc0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
27cd0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
27ce0 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74  11-04-15) Do not
27cf0 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20   do a full scan 
27d00 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20  of an unordered 
27d10 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
27d20 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
27d30 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79  practice the Key
27d40 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77  Info structure w
27d50 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
27d60 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20   It is only .   
27d70 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74       ** passed t
27d80 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65  o keep OP_OpenRe
27d90 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20  ad happy..      
27da0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72    */.        for
27db0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
27dc0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
27dd0 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
27de0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
27df0 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 20 26  >bUnordered==0 &
27e00 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64  & (!pBest || pId
27e10 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 42 65 73 74  x->nColumn<pBest
27e20 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 7b 0a 20 20  ->nColumn) ){.  
27e30 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20            pBest 
27e40 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
27e50 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
27e60 20 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20        if( pBest 
27e70 26 26 20 70 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d  && pBest->nColum
27e80 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  n<pTab->nCol ){.
27e90 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20            iRoot 
27ea0 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20  = pBest->tnum;. 
27eb0 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
27ec0 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  o = sqlite3Index
27ed0 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
27ee0 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pBest);.        
27ef0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  }..        /* Op
27f00 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  en a read-only c
27f10 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74  ursor, execute t
27f20 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f  he OP_Count, clo
27f30 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a  se the cursor. *
27f40 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
27f50 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
27f60 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72  P_OpenRead, iCsr
27f70 2c 20 69 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20  , iRoot, iDb);. 
27f80 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
27f90 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
27fa0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
27fb0 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
27fc0 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  r *)pKeyInfo, P4
27fd0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
27fe0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
27ff0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
28000 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75  AddOp2(v, OP_Cou
28010 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e  nt, iCsr, sAggIn
28020 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d  fo.aFunc[0].iMem
28030 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28040 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
28050 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b  OP_Close, iCsr);
28060 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
28070 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72  SimpleCount(pPar
28080 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29  se, pTab, pBest)
28090 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
280a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
280b0 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a  MIT_BTREECOUNT *
280c0 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
280d0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
280e0 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e  e query is of on
280f0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
28100 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20  ng forms:.      
28110 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
28120 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20    SELECT min(x) 
28130 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20  FROM ....       
28140 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78   **   SELECT max
28150 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
28160 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
28170 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
28180 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69  n ask the code i
28190 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74  n where.c to att
281a0 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73  empt to sort res
281b0 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ults.        ** 
281c0 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  as if there was 
281d0 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20  an "ORDER ON x" 
281e0 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44  or "ORDER ON x D
281f0 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20  ESC" clause. .  
28200 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72        ** If wher
28210 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70  e.c is able to p
28220 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73  roduce results s
28230 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72  orted in this or
28240 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  der, then.      
28250 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f    ** add vdbe co
28260 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  de to break out 
28270 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  of the processin
28280 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65  g loop after the
28290 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72   .        ** fir
282a0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69  st iteration (si
282b0 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74  nce the first it
282c0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
282d0 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20  oop is .        
282e0 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
282f0 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
28300 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e  row with the min
28310 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20  imum or maximum 
28320 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  .        ** valu
28330 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79  e of x, the only
28340 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a   row required)..
28350 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
28360 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20     ** A special 
28370 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73  flag must be pas
28380 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
28390 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c  ereBegin() to sl
283a0 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a  ightly.        *
283b0 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f  * modify behavio
283c0 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ur as follows:. 
283d0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
283e0 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20    **   + If the 
283f0 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45  query is a "SELE
28400 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e  CT min(x)", then
28410 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20   the loop coded 
28420 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  by.        **   
28430 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64    where.c should
28440 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65   not iterate ove
28450 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74  r any values wit
28460 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20  h a NULL value. 
28470 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f         **     fo
28480 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  r x..        **.
28490 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54          **   + T
284a0 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64  he optimizer cod
284b0 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68  e in where.c (th
284c0 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63  e thing that dec
284d0 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20  ides which.     
284e0 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20     **     index 
284f0 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73  or indices to us
28500 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20  e) should place 
28510 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f  a different prio
28520 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20  rity on .       
28530 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79 69   **     satisfyi
28540 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42 59  ng the 'ORDER BY
28550 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74  ' clause than it
28560 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63   does in other c
28570 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ases..        **
28580 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f       Refer to co
28590 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20  de and comments 
285a0 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64  in where.c for d
285b0 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20  etails..        
285c0 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  */.        ExprL
285d0 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30  ist *pMinMax = 0
285e0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c 61  ;.        u8 fla
285f0 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28  g = minMaxQuery(
28600 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
28610 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  flag ){.        
28620 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
28630 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 45  asProperty(p->pE
28640 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
28650 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
28660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
28670 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
28680 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  a[0].pExpr->x.pL
28690 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  ist->nExpr==1 );
286a0 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d  .          pMinM
286b0 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ax = sqlite3Expr
286c0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
286d0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
286e0 72 2d 3e 78 2e 70 4c 69 73 74 2c 30 29 3b 0a 20  r->x.pList,0);. 
286f0 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20           pDel = 
28700 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20  pMinMax;.       
28710 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26     if( pMinMax &
28720 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
28730 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
28740 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
28750 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61  .sortOrder = fla
28760 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g!=WHERE_ORDERBY
28770 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20  _MIN ?1:0;.     
28780 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
28790 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d  a[0].pExpr->op =
287a0 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
287b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
287c0 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
287d0 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
287e0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
287f0 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
28800 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
28810 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
28820 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
28830 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
28840 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
28850 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  row.        ** o
28860 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
28870 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73    */.        res
28880 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
28890 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
288a0 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
288b0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
288c0 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
288d0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
288e0 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29  MinMax,0,flag,0)
288f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
28900 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
28910 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28920 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
28930 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Del);.          
28940 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
28950 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28960 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
28970 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
28980 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
28990 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78   assert( pMinMax
289a0 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e  ==0 || pMinMax->
289b0 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nExpr==1 );.    
289c0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
289d0 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20  nOBSat>0 ){.    
289e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
289f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
28a00 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69  to, 0, pWInfo->i
28a10 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
28a20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
28a30 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78  , "%s() by index
28a40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
28a50 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f     (flag==WHERE_
28a60 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e  ORDERBY_MIN?"min
28a70 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20  ":"max")));.    
28a80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
28a90 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
28aa0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66  Info);.        f
28ab0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
28ac0 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
28ad0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  gInfo);.      }.
28ae0 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
28af0 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
28b00 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
28b10 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
28b20 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a  ddrEnd, SQLITE_J
28b30 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
28b40 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
28b50 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
28b60 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  pEList, 0, 0, 0,
28b70 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
28b80 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
28b90 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45  , addrEnd, addrE
28ba0 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nd);.      sqlit
28bb0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
28bc0 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
28bd0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
28be0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
28bf0 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a   addrEnd);.    .
28c00 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67    } /* endif agg
28c10 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
28c20 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74  .  if( sDistinct
28c30 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52  .eTnctType==WHER
28c40 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
28c50 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c  ERED ){.    expl
28c60 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
28c70 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29  rse, "DISTINCT")
28c80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
28c90 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
28ca0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
28cb0 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
28cc0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
28cd0 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
28ce0 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
28cf0 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
28d00 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
28d10 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
28d20 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
28d30 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20  "ORDER BY");.   
28d40 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
28d50 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20  l(pParse, p, v, 
28d60 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
28d70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Dest);.  }..  /*
28d80 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
28d90 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  ip this query.  
28da0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
28db0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
28dc0 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  iEnd);..  /* The
28dd0 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63   SELECT was succ
28de0 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20  essfully coded. 
28df0 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e    Set the return
28e00 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20   code to 0.  ** 
28e10 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65  to indicate no e
28e20 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rrors..  */.  rc
28e30 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74   = 0;..  /* Cont
28e40 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72  rol jumps to her
28e50 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
28e60 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f   encountered abo
28e70 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a  ve, or upon.  **
28e80 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69   successful codi
28e90 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ng of the SELECT
28ea0 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e  ..  */.select_en
28eb0 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  d:.  explainSetI
28ec0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69  nteger(pParse->i
28ed0 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f  SelectId, iResto
28ee0 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20  reSelectId);..  
28ef0 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75  /* Identify colu
28f00 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75  mn names if resu
28f10 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  lts of the SELEC
28f20 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70  T are to be outp
28f30 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ut..  */.  if( r
28f40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
28f50 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
28f60 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
28f70 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
28f80 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
28f90 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20  List, pEList);. 
28fa0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46   }..  sqlite3DbF
28fb0 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
28fc0 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  .aCol);.  sqlite
28fd0 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
28fe0 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72  Info.aFunc);.  r
28ff0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
29000 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
29010 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
29020 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  AIN)./*.** Gener
29030 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  ate a human-read
29040 61 62 6c 65 20 64 65 73 63 72 69 70 74 69 6f 6e  able description
29050 20 6f 66 20 61 20 74 68 65 20 53 65 6c 65 63 74   of a the Select
29060 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
29070 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f  ic void explainO
29080 6e 65 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70  neSelect(Vdbe *p
29090 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  Vdbe, Select *p)
290a0 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  {.  sqlite3Expla
290b0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
290c0 22 53 45 4c 45 43 54 20 22 29 3b 0a 20 20 69 66  "SELECT ");.  if
290d0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
290e0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
290f0 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20  Aggregate) ){.  
29100 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
29110 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
29120 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29130 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
29140 64 62 65 2c 20 22 44 49 53 54 49 4e 43 54 20 22  dbe, "DISTINCT "
29150 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
29160 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
29170 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20  F_Aggregate ){. 
29180 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
29190 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
291a0 20 22 61 67 67 5f 66 6c 61 67 20 22 29 3b 0a 20   "agg_flag ");. 
291b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
291c0 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
291d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
291e0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
291f0 2c 20 22 20 20 20 22 29 3b 0a 20 20 7d 0a 20 20  , "   ");.  }.  
29200 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
29210 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d  prList(pVdbe, p-
29220 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  >pEList);.  sqli
29230 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
29240 62 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  be);.  if( p->pS
29250 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e  rc && p->pSrc->n
29260 53 72 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Src ){.    int i
29270 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
29280 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
29290 2c 20 22 46 52 4f 4d 20 22 29 3b 0a 20 20 20 20  , "FROM ");.    
292a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75  sqlite3ExplainPu
292b0 73 68 28 70 56 64 62 65 29 3b 0a 20 20 20 20 66  sh(pVdbe);.    f
292c0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72  or(i=0; i<p->pSr
292d0 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
292e0 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
292f0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
29300 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d  = &p->pSrc->a[i]
29310 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
29320 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
29330 62 65 2c 20 22 7b 25 64 2c 2a 7d 20 3d 20 22 2c  be, "{%d,*} = ",
29340 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
29350 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
29360 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
29370 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29380 6c 61 69 6e 53 65 6c 65 63 74 28 70 56 64 62 65  lainSelect(pVdbe
29390 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
293a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
293b0 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20  Item->pTab ){.  
293c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
293d0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
293e0 62 65 2c 20 22 20 28 74 61 62 6e 61 6d 65 3d 25  be, " (tabname=%
293f0 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  s)", pItem->pTab
29400 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
29410 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
29420 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
29430 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
29440 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
29450 28 70 56 64 62 65 2c 20 22 25 73 22 2c 20 70 49  (pVdbe, "%s", pI
29460 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
29470 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
29480 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
29490 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
294a0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
294b0 62 65 2c 20 22 20 28 41 53 20 25 73 29 22 2c 20  be, " (AS %s)", 
294c0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
294d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
294e0 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  ( pItem->jointyp
294f0 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20  e & JT_LEFT ){. 
29500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
29510 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
29520 65 2c 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29  e, " LEFT-JOIN")
29530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29540 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
29550 28 70 56 64 62 65 29 3b 0a 20 20 20 20 7d 0a 20  (pVdbe);.    }. 
29560 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
29570 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 20 20 7d  nPop(pVdbe);.  }
29580 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
29590 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
295a0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
295b0 62 65 2c 20 22 57 48 45 52 45 20 22 29 3b 0a 20  be, "WHERE ");. 
295c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
295d0 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e  nExpr(pVdbe, p->
295e0 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c  pWhere);.    sql
295f0 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
29600 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
29610 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  p->pGroupBy ){. 
29620 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
29630 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
29640 47 52 4f 55 50 42 59 20 22 29 3b 0a 20 20 20 20  GROUPBY ");.    
29650 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
29660 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d  prList(pVdbe, p-
29670 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
29680 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
29690 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
296a0 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b  f( p->pHaving ){
296b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
296c0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
296d0 20 22 48 41 56 49 4e 47 20 22 29 3b 0a 20 20 20   "HAVING ");.   
296e0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
296f0 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 48  xpr(pVdbe, p->pH
29700 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
29710 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
29720 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
29730 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
29740 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
29750 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4f  Printf(pVdbe, "O
29760 52 44 45 52 42 59 20 22 29 3b 0a 20 20 20 20 73  RDERBY ");.    s
29770 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
29780 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e  rList(pVdbe, p->
29790 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73  pOrderBy);.    s
297a0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
297b0 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pVdbe);.  }.  if
297c0 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
297d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
297e0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
297f0 4c 49 4d 49 54 20 22 29 3b 0a 20 20 20 20 73 71  LIMIT ");.    sq
29800 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
29810 28 70 56 64 62 65 2c 20 70 2d 3e 70 4c 69 6d 69  (pVdbe, p->pLimi
29820 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
29830 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
29840 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
29850 66 66 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c  ffset ){.    sql
29860 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
29870 66 28 70 56 64 62 65 2c 20 22 4f 46 46 53 45 54  f(pVdbe, "OFFSET
29880 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
29890 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62  ExplainExpr(pVdb
298a0 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  e, p->pOffset);.
298b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
298c0 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d  inNL(pVdbe);.  }
298d0 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
298e0 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 56 64 62  xplainSelect(Vdb
298f0 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74  e *pVdbe, Select
29900 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30   *p){.  if( p==0
29910 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
29920 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
29930 62 65 2c 20 22 28 6e 75 6c 6c 2d 73 65 6c 65 63  be, "(null-selec
29940 74 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  t)");.    return
29950 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
29960 2d 3e 70 50 72 69 6f 72 20 29 20 70 20 3d 20 70  ->pPrior ) p = p
29970 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 73 71 6c 69  ->pPrior;.  sqli
29980 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70  te3ExplainPush(p
29990 56 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  Vdbe);.  while( 
299a0 70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  p ){.    explain
299b0 4f 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c  OneSelect(pVdbe,
299c0 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e   p);.    p = p->
299d0 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
299e0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
299f0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
29a00 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71  L(pVdbe);.    sq
29a10 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
29a20 74 66 28 70 56 64 62 65 2c 20 22 25 73 5c 6e 22  tf(pVdbe, "%s\n"
29a30 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
29a40 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71  ->op));.  }.  sq
29a50 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
29a60 74 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29  tf(pVdbe, "END")
29a70 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  ;.  sqlite3Expla
29a80 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a  inPop(pVdbe);.}.
29a90 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  ./* End of the s
29aa0 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70  tructure debug p
29ab0 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a  rinting code.***
29ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
29b10 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
29b20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
29b30 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a           _EXPLAIN) */.