/ Hex Artifact Content
Login

Artifact 7c6d028755131a47c0521a8b697428ebd382dbd3:


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 54 68  #endif../*.** Th
45f0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
4600: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
4610: 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20  r the inside of 
4620: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
4630: 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a  * of a SELECT..*
4640: 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61  *.** If srcTab a
4650: 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62  nd nColumn are b
4660: 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  oth zero, then t
4670: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
4680: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
4690: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
46a0: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
46b0: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
46c0: 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74  f nColumn>0.** t
46d0: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
46e0: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
46f0: 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65  nd pEList is use
4700: 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68  d only to get th
4710: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66  e.** datatypes f
4720: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
4730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
4740: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
4750: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4770: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
4780: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
47a0: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
47b0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
47c0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45  ing coded */.  E
47d0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
47e0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
47f0: 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65  f values being e
4800: 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e  xtracted */.  in
4810: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
4820: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
4830: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
4840: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  le */.  int nCol
4850: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
4860: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
4870: 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72  umns in the sour
4880: 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ce table */.  Ex
4890: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
48a0: 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20  ,     /* If not 
48b0: 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c  NULL, sort resul
48c0: 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65  ts using this ke
48d0: 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  y */.  int disti
48e0: 6e 63 74 54 61 62 2c 20 20 20 20 20 20 20 20 2f  nctTab,        /
48f0: 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73  * If >=0, make s
4900: 75 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ure results are 
4910: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65  distinct */.  Se
4920: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
4930: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
4940: 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72  dispose of the r
4950: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
4960: 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20  iContinue,      
4970: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
4980: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
4990: 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20  h next row */.  
49a0: 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
49b0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
49c0: 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  here to break ou
49d0: 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  t of the inner l
49e0: 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  oop */.){.  Vdbe
49f0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
4a00: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
4a10: 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b  int hasDistinct;
4a20: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
4a30: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
4a40: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
4a50: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  nt */.  int regR
4a60: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
4a70: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
4a80: 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72  memory holding r
4a90: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
4aa0: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
4ab0: 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f  ->eDest;   /* Ho
4ac0: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
4ad0: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
4ae0: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
4af0: 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73  iSDParm; /* Firs
4b00: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69  t argument to di
4b10: 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
4b20: 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f  .  int nResultCo
4b30: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
4b40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
4b50: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20  lt columns */.. 
4b60: 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20   assert( v );.  
4b70: 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
4b80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
4b90: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
4ba0: 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d  .  hasDistinct =
4bb0: 20 64 69 73 74 69 6e 63 74 54 61 62 3e 3d 30 3b   distinctTab>=0;
4bc0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d  .  if( pOrderBy=
4bd0: 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e  =0 && !hasDistin
4be0: 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66  ct ){.    codeOf
4bf0: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
4c00: 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  inue);.  }..  /*
4c10: 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73   Pull the reques
4c20: 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a  ted columns..  *
4c30: 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e  /.  if( nColumn>
4c40: 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74  0 ){.    nResult
4c50: 43 6f 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  Col = nColumn;. 
4c60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73   }else{.    nRes
4c70: 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d  ultCol = pEList-
4c80: 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66  >nExpr;.  }.  if
4c90: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
4ca0: 30 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e  0 ){.    pDest->
4cb0: 69 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e  iSdst = pParse->
4cc0: 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73  nMem+1;.    pDes
4cd0: 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75  t->nSdst = nResu
4ce0: 6c 74 43 6f 6c 3b 0a 20 20 20 20 70 50 61 72 73  ltCol;.    pPars
4cf0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
4d00: 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 7b 20  ltCol;.  }else{ 
4d10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65  .    assert( pDe
4d20: 73 74 2d 3e 6e 53 64 73 74 3d 3d 6e 52 65 73 75  st->nSdst==nResu
4d30: 6c 74 43 6f 6c 20 29 3b 0a 20 20 7d 0a 20 20 72  ltCol );.  }.  r
4d40: 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74  egResult = pDest
4d50: 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28 20 6e  ->iSdst;.  if( n
4d60: 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20  Column>0 ){.    
4d70: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
4d80: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
4d90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4da0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
4db0: 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65  srcTab, i, regRe
4dc0: 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20  sult+i);.    }. 
4dd0: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
4de0: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
4df0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
4e00: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20  stination is an 
4e10: 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72  EXISTS(...) expr
4e20: 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75  ession, the actu
4e30: 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  al.    ** values
4e40: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
4e50: 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20   SELECT are not 
4e60: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
4e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4e80: 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
4e90: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  e);.    sqlite3E
4ea0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
4eb0: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
4ec0: 72 65 67 52 65 73 75 6c 74 2c 20 65 44 65 73 74  regResult, eDest
4ed0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29 3b 0a 20  ==SRT_Output);. 
4ee0: 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e   }.  nColumn = n
4ef0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a  ResultCol;..  /*
4f00: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
4f10: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
4f20: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
4f30: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
4f40: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
4f50: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
4f60: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
4f70: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
4f80: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
4f90: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
4fa0: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
4fb0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
4fc0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  List!=0 );.    a
4fd0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e  ssert( pEList->n
4fe0: 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  Expr==nColumn );
4ff0: 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63  .    codeDistinc
5000: 74 28 70 50 61 72 73 65 2c 20 64 69 73 74 69 6e  t(pParse, distin
5010: 63 74 54 61 62 2c 20 69 43 6f 6e 74 69 6e 75 65  ctTab, iContinue
5020: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65  , nColumn, regRe
5030: 73 75 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 70  sult);.    if( p
5040: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
5050: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
5060: 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , p, iContinue);
5070: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
5080: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
5090: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
50a0: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
50b0: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
50c0: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
50d0: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
50e0: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
50f0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
5100: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
5110: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
5120: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
5130: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
5140: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5150: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5160: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5170: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
5180: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
5190: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  sult, nColumn, r
51a0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
51b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
51c0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
51d0: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  rm, r1);.      s
51e0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
51f0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5200: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5210: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e     }..    /* Con
5220: 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20  struct a record 
5230: 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72  from the query r
5240: 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65  esult, but inste
5250: 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76  ad of.    ** sav
5260: 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c  ing that record,
5270: 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79   use it as a key
5280: 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65   to delete eleme
5290: 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  nts from.    ** 
52a0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
52b0: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
52c0: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
52d0: 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73  xcept: {.      s
52e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
52f0: 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  (v, OP_IdxDelete
5300: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75  , iParm, regResu
5310: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  lt, nColumn);.  
5320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5330: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
5340: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
5350: 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
5360: 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
5370: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
5380: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
5390: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
53a0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
53b0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
53c0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
53d0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
53e0: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
53f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
5400: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
5410: 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
5420: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5430: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5440: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
5450: 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69  mn, r1);.      i
5460: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
5470: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
5480: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
5490: 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a  rderBy, p, r1);.
54a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
54b0: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
54c0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
54d0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
54e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
54f0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
5500: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
5510: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5520: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
5530: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
5540: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
5550: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5560: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
5570: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
5580: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
5590: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
55a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
55b0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
55c0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
55d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
55e0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
55f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
5600: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
5610: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
5620: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
5630: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
5640: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
5650: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
5660: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
5670: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
5680: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
5690: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
56a0: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
56b0: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
56c0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
56d0: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
56e0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
56f0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65  ==1 );.      pDe
5700: 73 74 2d 3e 61 66 66 53 64 73 74 20 3d 0a 20 20  st->affSdst =.  
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
5730: 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61  finity(pEList->a
5740: 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74  [0].pExpr, pDest
5750: 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20 20  ->affSdst);.    
5760: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
5770: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
5780: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
5790: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
57a0: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
57b0: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
57c0: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
57d0: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
57e0: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
57f0: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
5800: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
5810: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
5820: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
5830: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
5840: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
5850: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
5860: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
5870: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
5880: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
5890: 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52  OrderBy, p, regR
58a0: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65  esult);.      }e
58b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
58c0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
58d0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
58e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
58f0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
5900: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
5910: 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44  Result,1,r1, &pD
5920: 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29  est->affSdst, 1)
5930: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5940: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
5950: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
5960: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a   regResult, 1);.
5970: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5980: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5990: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
59a0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
59b0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
59c0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
59d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
59e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
59f0: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
5a00: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
5a10: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
5a20: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
5a30: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
5a40: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
5a50: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
5a60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5a70: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
5a80: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
5a90: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
5aa0: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
5ab0: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
5ac0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5ad0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
5ae0: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
5af0: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
5b00: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
5b10: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
5b20: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
5b30: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
5b40: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
5b50: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
5b60: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
5b70: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
5b80: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
5b90: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
5ba0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
5bb0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
5bc0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
5bd0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
5be0: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
5bf0: 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  p, regResult);. 
5c00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5c10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
5c20: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
5c30: 72 65 67 52 65 73 75 6c 74 2c 20 69 50 61 72 6d  regResult, iParm
5c40: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  , 1);.        /*
5c50: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
5c60: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
5c70: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
5c80: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
5c90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5ca0: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
5cb0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5cc0: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
5cd0: 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61  /* Send the data
5ce0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
5cf0: 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20   function or to 
5d00: 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49  a subroutine.  I
5d10: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73  n the.    ** cas
5d20: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
5d30: 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  e, the subroutin
5d40: 65 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70  e itself is resp
5d50: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20  onsible for.    
5d60: 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64  ** popping the d
5d70: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ata from the sta
5d80: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ck..    */.    c
5d90: 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
5da0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
5db0: 4f 75 74 70 75 74 3a 20 7b 0a 20 20 20 20 20 20  Output: {.      
5dc0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
5dd0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
5de0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
5df0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
5e00: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  put );.      if(
5e10: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
5e20: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
5e30: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5e40: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
5e50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5e60: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
5e70: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
5e80: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
5e90: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
5ea0: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
5eb0: 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20  derBy, p, r1);. 
5ec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
5ed0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
5ee0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
5ef0: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
5f00: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
5f10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5f20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5f30: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
5f40: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
5f50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5f60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5f70: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
5f80: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f  , regResult, nCo
5f90: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
5fa0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
5fb0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
5fc0: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
5fd0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
5fe0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5ff0: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
6000: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6010: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
6020: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
6030: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
6040: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
6050: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
6060: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
6070: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
6080: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
6090: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
60a0: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
60b0: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
60c0: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
60d0: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
60e0: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
60f0: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
6100: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
6110: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
6120: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
6130: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
6140: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
6150: 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d );.      break
6160: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
6170: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
6180: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6190: 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
61a0: 54 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 45  T is reached.  E
61b0: 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74  xcept, if.  ** t
61c0: 68 65 72 65 20 69 73 20 61 20 73 6f 72 74 65 72  here is a sorter
61d0: 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
61e0: 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20 61  the sorter has a
61f0: 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20  lready limited. 
6200: 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66   ** the output f
6210: 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  or us..  */.  if
6220: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ( pOrderBy==0 &&
6230: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
6240: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6250: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op3(v, OP_IfZero
6260: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
6270: 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a 7d 0a  eak, -1);.  }.}.
6280: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
6290: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
62a0: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
62b0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
62c0: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
62d0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
62e0: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
62f0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
6300: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
6310: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
6320: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
6330: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
6340: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
6350: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
6360: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
6370: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
6380: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
6390: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
63a0: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
63b0: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
63c0: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
63d0: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
63e0: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
63f0: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
6400: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
6410: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
6420: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
6430: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
6440: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
6450: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
6460: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
6470: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
6480: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
6490: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54   from malloc.  T
64a0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
64b0: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
64c0: 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67  sible for seeing
64d0: 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
64e0: 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
64f0: 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41 64  ly.** freed.  Ad
6500: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
6510: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 50  ructure to the P
6520: 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70  4 field of an op
6530: 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50 34  code using.** P4
6540: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
6550: 20 69 73 20 74 68 65 20 75 73 75 61 6c 20 77 61   is the usual wa
6560: 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69 74  y of dealing wit
6570: 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  h this..*/.stati
6580: 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e  c KeyInfo *keyIn
6590: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 50  foFromExprList(P
65a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
65b0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
65c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
65d0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
65e0: 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e  t nExpr;.  KeyIn
65f0: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72  fo *pInfo;.  str
6600: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
6610: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
6620: 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c  i;..  nExpr = pL
6630: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
6640: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
6650: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
6660: 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e  zeof(*pInfo) + n
6670: 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  Expr*(sizeof(Col
6680: 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69  lSeq*)+1) );.  i
6690: 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
66a0: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
66b0: 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f 2d  r = (u8*)&pInfo-
66c0: 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20  >aColl[nExpr];. 
66d0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64     pInfo->nField
66e0: 20 3d 20 28 75 31 36 29 6e 45 78 70 72 3b 0a 20   = (u16)nExpr;. 
66f0: 20 20 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20     pInfo->enc = 
6700: 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 49 6e  ENC(db);.    pIn
6710: 66 6f 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  fo->db = db;.   
6720: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
6730: 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70  pList->a; i<nExp
6740: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
6750: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
6760: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
6770: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
6780: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
6790: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
67a0: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
67b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
67c0: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
67d0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
67e0: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d   pInfo->aColl[i]
67f0: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
6800: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
6810: 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  r[i] = pItem->so
6820: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
6830: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
6840: 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  o;.}..#ifndef SQ
6850: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
6860: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
6870: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e  Name of the conn
6880: 65 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c  ection operator,
6890: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
68a0: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
68b0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
68c0: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74  selectOpName(int
68d0: 20 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b   id){.  char *z;
68e0: 0a 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b  .  switch( id ){
68f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
6900: 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49  :       z = "UNI
6910: 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b  ON ALL";   break
6920: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  ;.    case TK_IN
6930: 54 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e  TERSECT: z = "IN
6940: 54 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61  TERSECT";   brea
6950: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
6960: 58 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45  XCEPT:    z = "E
6970: 58 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65  XCEPT";      bre
6980: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
6990: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22             z = "
69a0: 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72  UNION";       br
69b0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
69c0: 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
69d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
69e0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
69f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6a00: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
6a10: 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58  ** Unless an "EX
6a20: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
6a30: 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69  " command is bei
6a40: 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68  ng processed, th
6a50: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
6a60: 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
6a70: 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20  wise, it adds a 
6a80: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75  single row of ou
6a90: 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20  tput to the EQP 
6aa0: 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65  result,.** where
6ab0: 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20   the caption is 
6ac0: 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
6ad0: 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42  **   "USE TEMP B
6ae0: 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a  -TREE FOR xxx".*
6af0: 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69  *.** where xxx i
6b00: 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e  s one of "DISTIN
6b10: 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20  CT", "ORDER BY" 
6b20: 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45  or "GROUP BY". E
6b30: 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20  xactly which.** 
6b40: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
6b50: 20 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75   the zUsage argu
6b60: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
6b70: 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70  void explainTemp
6b80: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
6b90: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
6ba0: 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20  *zUsage){.  if( 
6bb0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
6bc0: 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =2 ){.    Vdbe *
6bd0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
6be0: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73  e;.    char *zMs
6bf0: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
6c00: 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
6c10: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
6c20: 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29  FOR %s", zUsage)
6c30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6c40: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
6c50: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
6c60: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
6c70: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
6c80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6c90: 41 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f  Assign expressio
6ca0: 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e  n b to lvalue a.
6cb0: 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70   A second, no-op
6cc0: 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69  , version of thi
6cd0: 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72  s macro.** is pr
6ce0: 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49  ovided when SQLI
6cf0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
6d00: 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73  is defined. This
6d10: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65   allows the code
6d20: 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65  .** in sqlite3Se
6d30: 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e  lect() to assign
6d40: 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63   values to struc
6d50: 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69  ture member vari
6d60: 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e  ables that.** on
6d70: 6c 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49  ly exist if SQLI
6d80: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
6d90: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77  is not defined w
6da0: 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67  ithout polluting
6db0: 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74   the.** code wit
6dc0: 68 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74  h #ifndef direct
6dd0: 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e  ives..*/.# defin
6de0: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
6df0: 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a  ger(a, b) a = b.
6e00: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
6e10: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
6e20: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
6e30: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
6e40: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
6e50: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
6e60: 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78  y,z).# define ex
6e70: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
6e80: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y,z).#endif..#if
6e90: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6ea0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26  _OMIT_EXPLAIN) &
6eb0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
6ec0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
6ed0: 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e  SELECT)./*.** Un
6ee0: 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e  less an "EXPLAIN
6ef0: 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d   QUERY PLAN" com
6f00: 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72  mand is being pr
6f10: 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75  ocessed, this fu
6f20: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e  nction.** is a n
6f30: 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
6f40: 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c   it adds a singl
6f50: 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20  e row of output 
6f60: 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c  to the EQP resul
6f70: 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  t,.** where the 
6f80: 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e  caption is of on
6f90: 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72  e of the two for
6fa0: 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d  ms:.**.**   "COM
6fb0: 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45  POSITE SUBQUERIE
6fc0: 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  S iSub1 and iSub
6fd0: 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f  2 (op)".**   "CO
6fe0: 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49  MPOSITE SUBQUERI
6ff0: 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  ES iSub1 and iSu
7000: 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  b2 USING TEMP B-
7010: 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a  TREE (op)".**.**
7020: 20 77 68 65 72 65 20 69 53 75 62 31 20 61 6e 64   where iSub1 and
7030: 20 69 53 75 62 32 20 61 72 65 20 74 68 65 20 69   iSub2 are the i
7040: 6e 74 65 67 65 72 73 20 70 61 73 73 65 64 20 61  ntegers passed a
7050: 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
7060: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
7070: 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20  parameters, and 
7080: 6f 70 20 69 73 20 74 68 65 20 74 65 78 74 20 72  op is the text r
7090: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
70a0: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a   the parameter.*
70b0: 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  * of the same na
70c0: 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  me. The paramete
70d0: 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f  r "op" must be o
70e0: 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20  ne of TK_UNION, 
70f0: 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b  TK_EXCEPT,.** TK
7100: 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b  _INTERSECT or TK
7110: 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20  _ALL. The first 
7120: 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20  form is used if 
7130: 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70  argument bUseTmp
7140: 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f   is .** false, o
7150: 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72  r the second for
7160: 6d 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e  m if it is true.
7170: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7180: 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
7190: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
71a0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
71b0: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
71c0: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  text */.  int op
71d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
71e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
71f0: 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b   of TK_UNION, TK
7200: 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a  _EXCEPT etc. */.
7210: 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20    int iSub1,    
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7230: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
7240: 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62   1 */.  int iSub
7250: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
7260: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75          /* Subqu
7270: 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e  ery id 2 */.  in
7280: 74 20 62 55 73 65 54 6d 70 20 20 20 20 20 20 20  t bUseTmp       
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
72a0: 20 54 72 75 65 20 69 66 20 61 20 74 65 6d 70 20   True if a temp 
72b0: 74 61 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a  table was used *
72c0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f  /.){.  assert( o
72d0: 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f  p==TK_UNION || o
72e0: 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
72f0: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
7300: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   || op==TK_ALL )
7310: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
7320: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
7330: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
7340: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63  se->pVdbe;.    c
7350: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
7360: 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20  te3MPrintf(.    
7370: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20      pParse->db, 
7380: 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45  "COMPOUND SUBQUE
7390: 52 49 45 53 20 25 64 20 41 4e 44 20 25 64 20 25  RIES %d AND %d %
73a0: 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69  s(%s)", iSub1, i
73b0: 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55  Sub2,.        bU
73c0: 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d  seTmp?"USING TEM
73d0: 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73  P B-TREE ":"", s
73e0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a  electOpName(op).
73f0: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
7400: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
7410: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
7420: 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
7430: 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
7440: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  NAMIC);.  }.}.#e
7450: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
7460: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
7470: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
7480: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
7490: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
74a0: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77  ainComposite(v,w
74b0: 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
74c0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
74d0: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
74e0: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
74f0: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
7500: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
7510: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
7520: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
7530: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
7540: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
7550: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
7560: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
7570: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
7580: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
7590: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
75a0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
75b0: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
75c0: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
75d0: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
75e0: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
75f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
7600: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
7610: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
7620: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
7630: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7640: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20   */.  Vdbe *v,  
7650: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
7660: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
7670: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74  is VDBE */.  int
7680: 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f   nColumn,      /
7690: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
76a0: 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  mns of data */. 
76b0: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
76c0: 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  st /* Write the 
76d0: 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68  sorted results h
76e0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
76f0: 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69  addrBreak = sqli
7700: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
7710: 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70  (v);     /* Jump
7720: 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f   here to exit lo
7730: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
7740: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
7750: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
7760: 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  v);  /* Jump her
7770: 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65  e for next cycle
7780: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a   */.  int addr;.
7790: 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e    int iTab;.  in
77a0: 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b  t pseudoTab = 0;
77b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
77c0: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
77d0: 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73  rBy;..  int eDes
77e0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
77f0: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
7800: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a  pDest->iSDParm;.
7810: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20  .  int regRow;. 
7820: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a   int regRowid;..
7830: 20 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42    iTab = pOrderB
7840: 79 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 72  y->iECursor;.  r
7850: 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47  egRow = sqlite3G
7860: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
7870: 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  );.  if( eDest==
7880: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
7890: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
78a0: 6e 65 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f  ne ){.    pseudo
78b0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
78c0: 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  ab++;.    sqlite
78d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
78e0: 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73  P_OpenPseudo, ps
78f0: 65 75 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c  eudoTab, regRow,
7900: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72   nColumn);.    r
7910: 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 7d  egRowid = 0;.  }
7920: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
7930: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
7940: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
7950: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c    }.  if( p->sel
7960: 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53 6f  Flags & SF_UseSo
7970: 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  rter ){.    int 
7980: 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70  regSortOut = ++p
7990: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
79a0: 20 69 6e 74 20 70 74 61 62 32 20 3d 20 70 50 61   int ptab2 = pPa
79b0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
79c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
79d0: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
79e0: 75 64 6f 2c 20 70 74 61 62 32 2c 20 72 65 67 53  udo, ptab2, regS
79f0: 6f 72 74 4f 75 74 2c 20 70 4f 72 64 65 72 42 79  ortOut, pOrderBy
7a00: 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20 20  ->nExpr+2);.    
7a10: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
7a20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7a30: 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69  OP_SorterSort, i
7a40: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
7a50: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
7a60: 76 2c 20 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e  v, p, addrContin
7a70: 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ue);.    sqlite3
7a80: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7a90: 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61  _SorterData, iTa
7aa0: 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 29 3b 0a  b, regSortOut);.
7ab0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7ac0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
7ad0: 6d 6e 2c 20 70 74 61 62 32 2c 20 70 4f 72 64 65  mn, ptab2, pOrde
7ae0: 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65  rBy->nExpr+1, re
7af0: 67 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74  gRow);.    sqlit
7b00: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
7b10: 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41  , OPFLAG_CLEARCA
7b20: 43 48 45 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  CHE);.  }else{. 
7b30: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
7b40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7b50: 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62  v, OP_Sort, iTab
7b60: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
7b70: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
7b80: 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  p, addrContinue)
7b90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7ba0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
7bb0: 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64  lumn, iTab, pOrd
7bc0: 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72  erBy->nExpr+1, r
7bd0: 65 67 52 6f 77 29 3b 0a 20 20 7d 0a 20 20 73 77  egRow);.  }.  sw
7be0: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
7bf0: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
7c00: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
7c10: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
7c20: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7c30: 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a  t==SRT_Table );.
7c40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7c50: 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
7c60: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  Tab );.      sql
7c70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7c80: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
7c90: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b  Parm, regRowid);
7ca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7cb0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
7cc0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
7cd0: 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b  gRow, regRowid);
7ce0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7cf0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
7d00: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
7d10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7d20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7d30: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
7d40: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
7d50: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
7d60: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
7d70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7d80: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
7d90: 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20  Record, regRow, 
7da0: 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20  1, regRowid,.   
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 20 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66       &pDest->aff
7dd0: 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Sdst, 1);.      
7de0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
7df0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
7e00: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31  Parse, regRow, 1
7e10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7e20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7e30: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7e40: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
7e50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7e60: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
7e70: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
7e80: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
7e90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
7ea0: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
7eb0: 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d  e, regRow, iParm
7ec0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
7ed0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
7ee0: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
7ef0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
7f00: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
7f10: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
7f20: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
7f30: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 61 73   int i;.      as
7f40: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
7f50: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
7f60: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
7f70: 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63 61  ); .      testca
7f80: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
7f90: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74  utput );.      t
7fa0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7fb0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
7fc0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
7fd0: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
7fe0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7ff0: 20 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e   regRow!=pDest->
8000: 69 53 64 73 74 2b 69 20 29 3b 0a 20 20 20 20 20  iSdst+i );.     
8010: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8020: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
8030: 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c  n, pseudoTab, i,
8040: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 69 29   pDest->iSdst+i)
8050: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  ;.        if( i=
8060: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8070: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
8080: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c  eP5(v, OPFLAG_CL
8090: 45 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20  EARCACHE);.     
80a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
80b0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
80c0: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
80d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
80e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
80f0: 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53  ltRow, pDest->iS
8100: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
8110: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
8120: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
8130: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44  hange(pParse, pD
8140: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
8150: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
8160: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
8170: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
8180: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
8190: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
81a0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
81b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
81c0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
81d0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
81e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
81f0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
8200: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20  e, regRowid);.. 
8210: 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f   /* The bottom o
8220: 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  f the loop.  */.
8230: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
8240: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
8250: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66  rContinue);.  if
8260: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
8270: 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  SF_UseSorter ){.
8280: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8290: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
82a0: 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  erNext, iTab, ad
82b0: 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dr);.  }else{.  
82c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
82d0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
82e0: 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d  iTab, addr);.  }
82f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
8300: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
8310: 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20  drBreak);.  if( 
8320: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
8330: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
8340: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
8350: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8360: 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
8370: 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20  pseudoTab, 0);. 
8380: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
8390: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
83a0: 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
83b0: 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61  ing the 'declara
83c0: 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68  tion type' of th
83d0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
83e0: 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e  pExpr. The strin
83f0: 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64  g may be treated
8400: 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68   as static by th
8410: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
8420: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
8430: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
8440: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
8450: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
8460: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67  from the.** orig
8470: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
8480: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
8490: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
84a0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a   a column. The.*
84b0: 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  * declaration ty
84c0: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
84d0: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
84e0: 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e   Exactly when an
84f0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
8500: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  s considered a c
8510: 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d  olumn can be com
8520: 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73  plex in the pres
8530: 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69  ence of subqueri
8540: 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c  es. The.** resul
8550: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
8560: 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   in all of the f
8570: 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20  ollowing SELECT 
8580: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a  statements is .*
8590: 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  * considered a c
85a0: 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75  olumn by this fu
85b0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
85c0: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
85d0: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
85e0: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
85f0: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
8600: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
8610: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53  ROM tbl);.**   S
8620: 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28  ELECT abc FROM (
8630: 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62  SELECT col AS ab
8640: 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  c FROM tbl);.** 
8650: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
8660: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79  ion type for any
8670: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65   expression othe
8680: 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20  r than a column 
8690: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  is NULL..*/.stat
86a0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
86b0: 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20 4e 61 6d  olumnType(.  Nam
86c0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
86d0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20    Expr *pExpr,. 
86e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
86f0: 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63 6f 6e 73  OriginDb,.  cons
8700: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69  t char **pzOrigi
8710: 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  nTab,.  const ch
8720: 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c  ar **pzOriginCol
8730: 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
8740: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 63   *zType = 0;.  c
8750: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
8760: 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  inDb = 0;.  char
8770: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 54   const *zOriginT
8780: 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  ab = 0;.  char c
8790: 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c  onst *zOriginCol
87a0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
87b0: 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
87c0: 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72  ==0) || pNC->pSr
87d0: 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  cList==0 ) retur
87e0: 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  n 0;..  switch( 
87f0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
8800: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
8810: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
8820: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
8830: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
8840: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
8850: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
8860: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62   the column is b
8870: 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78  eing.      ** ex
8880: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20  tracted from in 
8890: 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63  NameContext.pSrc
88a0: 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65  List. This table
88b0: 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20   may be real.   
88c0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74     ** database t
88d0: 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65  able or a subque
88e0: 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ry..      */.   
88f0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
8900: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
8910: 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  * Table structur
8920: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
8930: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
8940: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
8950: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8960: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f  /* Select the co
8970: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
8980: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
8990: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
89a0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49  ->iColumn;  /* I
89b0: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
89c0: 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20  n pTab */.      
89d0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
89e0: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
89f0: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
8a00: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
8a10: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
8a20: 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26      while( pNC &
8a30: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20  & !pTab ){.     
8a40: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62     SrcList *pTab
8a50: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
8a60: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
8a70: 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74  r(j=0;j<pTabList
8a80: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
8a90: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
8aa0: 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  !=pExpr->iTable;
8ab0: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  j++);.        if
8ac0: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
8ad0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
8ae0: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
8af0: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
8b00: 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c        pS = pTabL
8b10: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63  ist->a[j].pSelec
8b20: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
8b30: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
8b40: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
8b50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8b60: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
8b70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
8b80: 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f   At one time, co
8b90: 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45  de such as "SELE
8ba0: 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e  CT new.x" within
8bb0: 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64   a trigger would
8bc0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73  .        ** caus
8bd0: 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  e this condition
8be0: 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20   to run.  Since 
8bf0: 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65  then, we have re
8c00: 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20  structured how. 
8c10: 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65         ** trigge
8c20: 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  r code is genera
8c30: 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ted and so this 
8c40: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20  condition is no 
8c50: 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20  longer .        
8c60: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77  ** possible. How
8c70: 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69  ever, it can sti
8c80: 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73  ll be true for s
8c90: 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20  tatements like. 
8ca0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f         ** the fo
8cb0: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20  llowing:.       
8cc0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
8cd0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
8ce0: 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20  (col INTEGER);. 
8cf0: 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
8d00: 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  CT (SELECT t1.co
8d10: 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b  l) FROM FROM t1;
8d20: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
8d30: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75      ** when colu
8d40: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
8d50: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
8d60: 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e  sion "t1.col" in
8d70: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
8d80: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20   sub-select. In 
8d90: 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74  this case, set t
8da0: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74  he column type t
8db0: 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20  o NULL, even.   
8dc0: 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69       ** though i
8dd0: 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20  t should really 
8de0: 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20  be "INTEGER"..  
8df0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
8e00: 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
8e10: 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68  a problem, as th
8e20: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66  e column type of
8e30: 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76   "t1.col" is nev
8e40: 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  er.        ** us
8e50: 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54  ed. When columnT
8e60: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
8e70: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
8e80: 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28  n .        ** "(
8e90: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c  SELECT t1.col)",
8ea0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70   the correct typ
8eb0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73  e is returned (s
8ec0: 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54  ee the TK_SELECT
8ed0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e  .        ** bran
8ee0: 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ch below.  */.  
8ef0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8f00: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
8f10: 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70  rt( pTab && pExp
8f20: 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b  r->pTab==pTab );
8f30: 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b  .      if( pS ){
8f40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
8f50: 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61  "table" is actua
8f60: 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74  lly a sub-select
8f70: 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68   or a view in th
8f80: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
8f90: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
8fa0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8fb0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
8fc0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
8fd0: 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20  d origin.       
8fe0: 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65   ** data for the
8ff0: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
9000: 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  mn of the sub-se
9010: 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lect..        */
9020: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
9030: 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69  l>=0 && ALWAYS(i
9040: 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  Col<pS->pEList->
9050: 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  nExpr) ){.      
9060: 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69      /* If iCol i
9070: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
9080: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
9090: 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74  ssion requests t
90a0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
90b0: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62  rowid of the sub
90c0: 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
90d0: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
90e0: 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a   is legal (see .
90f0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73            ** tes
9100: 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32  t case misc2.2.2
9110: 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76  ) - it always ev
9120: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e  aluates to NULL.
9130: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
9140: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
9150: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20  ext sNC;.       
9160: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
9170: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
9180: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
9190: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
91a0: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
91b0: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
91c0: 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pNC;.          
91d0: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
91e0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
91f0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
9200: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
9210: 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72  &zOriginDb, &zOr
9220: 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69  iginTab, &zOrigi
9230: 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20  nCol); .        
9240: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
9250: 28 20 41 4c 57 41 59 53 28 70 54 61 62 2d 3e 70  ( ALWAYS(pTab->p
9260: 53 63 68 65 6d 61 29 20 29 7b 0a 20 20 20 20 20  Schema) ){.     
9270: 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62     /* A real tab
9280: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  le */.        as
9290: 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20  sert( !pS );.   
92a0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
92b0: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
92c0: 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73  PKey;.        as
92d0: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
92e0: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
92f0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
9300: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
9310: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
9320: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
9330: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ER";.          z
9340: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77  OriginCol = "row
9350: 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  id";.        }el
9360: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se{.          zT
9370: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
9380: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
9390: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43          zOriginC
93a0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ol = pTab->aCol[
93b0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  iCol].zName;.   
93c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
93d0: 4f 72 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62  OriginTab = pTab
93e0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
93f0: 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65   if( pNC->pParse
9400: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
9410: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
9420: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43  chemaToIndex(pNC
9430: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  ->pParse->db, pT
9440: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
9450: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44          zOriginD
9460: 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  b = pNC->pParse-
9470: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
9480: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ame;.        }. 
9490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
94a0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
94b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
94c0: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
94d0: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
94e0: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
94f0: 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65  sion is a sub-se
9500: 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65  lect. Return the
9510: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
9520: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f  e and.      ** o
9530: 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74  rigin info for t
9540: 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  he single column
9550: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
9560: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
9570: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
9580: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
9590: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
95a0: 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sNC;.      Selec
95b0: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78  t *pS = pExpr->x
95c0: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
95d0: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
95e0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
95f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9600: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9610: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
9620: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
9630: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
9640: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43  >pSrc;.      sNC
9650: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
9660: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
9670: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
9680: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
9690: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
96a0: 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72  &zOriginDb, &zOr
96b0: 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69  iginTab, &zOrigi
96c0: 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72  nCol); .      br
96d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
96e0: 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70  f.  }.  .  if( p
96f0: 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a 20 20 20  zOriginDb ){.   
9700: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 69   assert( pzOrigi
9710: 6e 54 61 62 20 26 26 20 70 7a 4f 72 69 67 69 6e  nTab && pzOrigin
9720: 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72  Col );.    *pzOr
9730: 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e  iginDb = zOrigin
9740: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69  Db;.    *pzOrigi
9750: 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61  nTab = zOriginTa
9760: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e  b;.    *pzOrigin
9770: 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c  Col = zOriginCol
9780: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
9790: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Type;.}../*.** G
97a0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
97b0: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
97c0: 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61  VDBE the declara
97d0: 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f  tion types of co
97e0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
97f0: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
9800: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
9810: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a  ateColumnTypes(.
9820: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9830: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
9840: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
9850: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
9860: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
9870: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
9880: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
9890: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
98a0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
98b0: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  et */.){.#ifndef
98c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
98d0: 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20  LTYPE.  Vdbe *v 
98e0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
98f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
9900: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
9910: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
9920: 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50  abList;.  sNC.pP
9930: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
9940: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
9950: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
9960: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
9970: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
9980: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
9990: 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66  r *zType;.#ifdef
99a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
99b0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
99c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
99d0: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
99e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
99f0: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
9a00: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
9a10: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70  ol = 0;.    zTyp
9a20: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
9a30: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
9a40: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
9a50: 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a  rigCol);..    /*
9a60: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
9a70: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
9a80: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
9a90: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
9aa0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
9ab0: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
9ac0: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
9ad0: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
9ae0: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
9af0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
9b00: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
9b10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9b20: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
9b30: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
9b40: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49  E, zOrigDb, SQLI
9b50: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
9b60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
9b70: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
9b80: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
9b90: 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54  rigTab, SQLITE_T
9ba0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
9bb0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
9bc0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
9bd0: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
9be0: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
9bf0: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
9c00: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
9c10: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
9c20: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
9c30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
9c40: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
9c50: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
9c60: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
9c70: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
9c80: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9c90: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 20 2a 2f  OMIT_DECLTYPE */
9ca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
9cb0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
9cc0: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
9cd0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
9ce0: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
9cf0: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73  esult set.  This
9d00: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
9d10: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
9d20: 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76  the.** azCol[] v
9d30: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  alues in the cal
9d40: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
9d50: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
9d60: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
9d70: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9d80: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
9d90: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
9da0: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
9db0: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
9dc0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
9dd0: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
9de0: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
9df0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
9e00: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
9e10: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
9e20: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
9e30: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9e40: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
9e50: 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d  lNames, shortNam
9e60: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
9e70: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
9e80: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
9e90: 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69   an EXPLAIN, ski
9ea0: 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20  p this step */. 
9eb0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
9ec0: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  lain ){.    retu
9ed0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
9ee0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
9ef0: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56  lNamesSet || NEV
9f00: 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e  ER(v==0) || db->
9f10: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
9f20: 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d  eturn;.  pParse-
9f30: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
9f40: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20  ;.  fullNames = 
9f50: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
9f60: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
9f70: 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d  )!=0;.  shortNam
9f80: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
9f90: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
9fa0: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71  lNames)!=0;.  sq
9fb0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
9fc0: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
9fd0: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
9fe0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
9ff0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
a000: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45  r *p;.    p = pE
a010: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
a020: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
a030: 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  p==0) ) continue
a040: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
a050: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
a060: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
a070: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
a080: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
a090: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
a0a0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
a0b0: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
a0c0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
a0d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a0e0: 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  (p->op==TK_COLUM
a0f0: 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  N || p->op==TK_A
a100: 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54  GG_COLUMN) && pT
a110: 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  abList ){.      
a120: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
a130: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
a140: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
a150: 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  p->iColumn;.    
a160: 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59    for(j=0; ALWAY
a170: 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  S(j<pTabList->nS
a180: 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rc); j++){.     
a190: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
a1a0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70  >a[j].iCursor==p
a1b0: 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b  ->iTable ) break
a1c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a1d0: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
a1e0: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
a1f0: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
a200: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
a210: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
a220: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
a230: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
a240: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
a250: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
a260: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
a270: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
a280: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
a290: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
a2a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a2b0: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
a2c0: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
a2d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a2e0: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
a2f0: 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20  !fullNames ){.  
a300: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a310: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
a320: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
a330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
a340: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
a350: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
a360: 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e  pan), SQLITE_DYN
a370: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
a380: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
a390: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
a3a0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
a3b0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
a3c0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
a3d0: 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
a3e0: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  Name, zCol);.   
a3f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a400: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
a410: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
a420: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e  Name, SQLITE_DYN
a430: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
a440: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
a450: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
a460: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
a470: 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49  NAME, zCol, SQLI
a480: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
a490: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
a4a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
a4b0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
a4c0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
a4d0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
a4e0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
a4f0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
a500: 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e  pan), SQLITE_DYN
a510: 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
a520: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
a530: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
a540: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
a550: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
a560: 20 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e   a an expression
a570: 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20   list (which is 
a580: 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20  really the list 
a590: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  of expressions.*
a5a0: 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  * that form the 
a5b0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
a5c0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
a5d0: 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70  ) compute approp
a5e0: 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  riate.** column 
a5f0: 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c  names for a tabl
a600: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c  e that would hol
a610: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
a620: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c   list..**.** All
a630: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69   column names wi
a640: 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a  ll be unique..**
a650: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c  .** Only the col
a660: 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f  umn names are co
a670: 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e  mputed.  Column.
a680: 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43  zType, Column.zC
a690: 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  oll,.** and othe
a6a0: 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75  r fields of Colu
a6b0: 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  mn are zeroed..*
a6c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
a6d0: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
a6e0: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
a6f0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
a700: 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65  occurs,.** store
a710: 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20   NULL in *paCol 
a720: 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20  and 0 in *pnCol 
a730: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
a740: 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74  E_NOMEM..*/.stat
a750: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c  ic int selectCol
a760: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
a770: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a780: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
a790: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a7a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
a7b0: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45  List,       /* E
a7c0: 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68  xpr list from wh
a7d0: 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f  ich to derive co
a7e0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
a7f0: 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  i16 *pnCol,     
a800: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
a810: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
a820: 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20  olumns here */. 
a830: 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20   Column **paCol 
a840: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
a850: 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  e the new column
a860: 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b   list here */.){
a870: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a880: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
a890: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
a8a0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
a8b0: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
a8c0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
a8d0: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
a8e0: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
a8f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
a900: 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20  x added to make 
a910: 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20  the name unique 
a920: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
a930: 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  l, *pCol;       
a940: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
a950: 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75  over result colu
a960: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mns */.  int nCo
a970: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
a980: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a990: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
a9a0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
a9b0: 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20   Expr *p;       
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a9d0: 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61  Expression for a
a9e0: 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63   single result c
a9f0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
aa00: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
aa10: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
aa20: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
aa30: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
aa40: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
aa50: 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b  f name in zName[
aa60: 5d 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69  ] */..  if( pELi
aa70: 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  st ){.    nCol =
aa80: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
aa90: 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74      aCol = sqlit
aaa0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
aab0: 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30  b, sizeof(aCol[0
aac0: 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65  ])*nCol);.    te
aad0: 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20  stcase( aCol==0 
aae0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
aaf0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43  nCol = 0;.    aC
ab00: 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  ol = 0;.  }.  *p
ab10: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a  nCol = nCol;.  *
ab20: 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20  paCol = aCol;.. 
ab30: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
ab40: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  Col; i<nCol; i++
ab50: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f  , pCol++){.    /
ab60: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
ab70: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
ab80: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
ab90: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
aba0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
abb0: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
abc0: 74 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50  t==0 || ExprHasP
abd0: 72 6f 70 65 72 74 79 28 70 2d 3e 70 52 69 67 68  roperty(p->pRigh
abe0: 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 0a  t, EP_IntValue).
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
ac00: 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a  | p->pRight->u.z
ac10: 54 6f 6b 65 6e 3d 3d 30 20 7c 7c 20 70 2d 3e 70  Token==0 || p->p
ac20: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  Right->u.zToken[
ac30: 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  0]!=0 );.    if(
ac40: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
ac50: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
ac60: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
ac70: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
ac80: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
ac90: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
aca0: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
acb0: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
acc0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
acd0: 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  up(db, zName);. 
ace0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
acf0: 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d  Expr *pColExpr =
ad00: 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72   p;  /* The expr
ad10: 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74  ession that is t
ad20: 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  he result column
ad30: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54   name */.      T
ad40: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
ad50: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73      /* Table ass
ad60: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
ad70: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
ad80: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f        while( pCo
ad90: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  lExpr->op==TK_DO
ada0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  T ){.        pCo
adb0: 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72  lExpr = pColExpr
adc0: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
add0: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78    assert( pColEx
ade0: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  pr!=0 );.      }
adf0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45  .      if( pColE
ae00: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
ae10: 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f  MN && ALWAYS(pCo
ae20: 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20  lExpr->pTab!=0) 
ae30: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ){.        /* Fo
ae40: 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68  r columns use th
ae50: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61  e column name na
ae60: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
ae70: 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70  t iCol = pColExp
ae80: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
ae90: 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45      pTab = pColE
aea0: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
aeb0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
aec0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
aed0: 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
aee0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
aef0: 74 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20  tf(db, "%s",.   
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
af10: 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43  ol>=0 ? pTab->aC
af20: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a  ol[iCol].zName :
af30: 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20   "rowid");.     
af40: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45   }else if( pColE
af50: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
af60: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
af70: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
af80: 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f  ty(pColExpr, EP_
af90: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
afa0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
afb0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
afc0: 22 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e  "%s", pColExpr->
afd0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
afe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
aff0: 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69  /* Use the origi
b000: 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20  nal text of the 
b010: 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
b020: 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f  n as its name */
b030: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
b040: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
b050: 64 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74  db, "%s", pEList
b060: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[i].zSpan);. 
b070: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b080: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
b090: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73  ailed ){.      s
b0a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
b0b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62   zName);.      b
b0c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
b0d0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
b0e0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  e column name is
b0f0: 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65   unique.  If the
b100: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69   name is not uni
b110: 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65  que,.    ** appe
b120: 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20  nd a integer to 
b130: 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
b140: 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
b150: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  ue..    */.    n
b160: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
b170: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
b180: 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20     for(j=cnt=0; 
b190: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
b1a0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
b1b0: 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  Cmp(aCol[j].zNam
b1c0: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  e, zName)==0 ){.
b1d0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
b1e0: 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  ewName;.        
b1f0: 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30  zName[nName] = 0
b200: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61  ;.        zNewNa
b210: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
b220: 6e 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c  ntf(db, "%s:%d",
b230: 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a   zName, ++cnt);.
b240: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
b250: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
b260: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
b270: 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20  = zNewName;.    
b280: 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20      j = -1;.    
b290: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
b2a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
b2b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  }.    }.    pCol
b2c0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
b2d0: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d  .  }.  if( db->m
b2e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b2f0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b     for(j=0; j<i;
b300: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   j++){.      sql
b310: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
b320: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[j].zName);. 
b330: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b340: 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29  DbFree(db, aCol)
b350: 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30  ;.    *paCol = 0
b360: 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30  ;.    *pnCol = 0
b370: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
b380: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
b390: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b3a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
b3b0: 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
b3c0: 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  on information t
b3d0: 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  o a column list 
b3e0: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45  based on.** a SE
b3f0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
b400: 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ** .** The colum
b410: 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c  n list presumabl
b420: 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65  y came from sele
b430: 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f  ctColumnNamesFro
b440: 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20  mExprList()..** 
b450: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
b460: 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20  has only names, 
b470: 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c  not types or col
b480: 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a  lations.  This.*
b490: 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  * routine goes t
b4a0: 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20  hrough and adds 
b4b0: 74 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f  the types and co
b4c0: 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  llations..**.** 
b4d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71  This routine req
b4e0: 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69  uires that all i
b4f0: 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68  dentifiers in th
b500: 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  e SELECT.** stat
b510: 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65  ement be resolve
b520: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
b530: 64 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  d selectAddColum
b540: 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
b550: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
b560: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
b570: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a  rsing contexts *
b580: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20  /.  int nCol,   
b590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b5a0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a  ber of columns *
b5b0: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
b5c0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  ,         /* Lis
b5d0: 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  t of columns */.
b5e0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
b5f0: 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43  t       /* SELEC
b600: 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  T used to determ
b610: 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f  ine types and co
b620: 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  llations */.){. 
b630: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b640: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d  Parse->db;.  Nam
b650: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
b660: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
b670: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
b680: 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20    int i;.  Expr 
b690: 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  *p;.  struct Exp
b6a0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a  rList_item *a;..
b6b0: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
b6c0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
b6d0: 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  ( (pSelect->selF
b6e0: 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
b6f0: 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ed)!=0 );.  asse
b700: 72 74 28 20 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  rt( nCol==pSelec
b710: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
b720: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
b730: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
b740: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b750: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
b760: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
b770: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
b780: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
b790: 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
b7a0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
b7b0: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
b7c0: 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b  ol=aCol; i<nCol;
b7d0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
b7e0: 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70     p = a[i].pExp
b7f0: 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79  r;.    pCol->zTy
b800: 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  pe = sqlite3DbSt
b810: 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54  rDup(db, columnT
b820: 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20  ype(&sNC, p, 0, 
b830: 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c  0, 0));.    pCol
b840: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
b850: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
b860: 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  (p);.    if( pCo
b870: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29  l->affinity==0 )
b880: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
b890: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
b8a0: 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  E;.    pColl = s
b8b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
b8c0: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
b8d0: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
b8e0: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c       pCol->zColl
b8f0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
b900: 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  up(db, pColl->zN
b910: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
b920: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
b930: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b940: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
b950: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
b960: 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
b970: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
b980: 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
b990: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
b9a0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
b9b0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
b9c0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
b9d0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
b9e0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
b9f0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
ba00: 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  int savedFlags;.
ba10: 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20  .  savedFlags = 
ba20: 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d  db->flags;.  db-
ba30: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
ba40: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
ba50: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
ba60: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
ba70: 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  mes;.  sqlite3Se
ba80: 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
ba90: 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20   pSelect, 0);.  
baa0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
bab0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
bac0: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
bad0: 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
bae0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
baf0: 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d  r;.  db->flags =
bb00: 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70   savedFlags;.  p
bb10: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
bb20: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
bb30: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
bb40: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
bb50: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bb60: 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74  }.  /* The sqlit
bb70: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
bb80: 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73  ect() is only us
bb90: 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68  ed n contexts wh
bba0: 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20  ere lookaside.  
bbb0: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ** is disabled *
bbc0: 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  /.  assert( db->
bbd0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
bbe0: 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62 2d  ed==0 );.  pTab-
bbf0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  >nRef = 1;.  pTa
bc00: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
bc10: 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20  pTab->nRowEst = 
bc20: 31 30 30 30 30 30 30 3b 0a 20 20 73 65 6c 65 63  1000000;.  selec
bc30: 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
bc40: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
bc50: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70  lect->pEList, &p
bc60: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
bc70: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63  ->aCol);.  selec
bc80: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
bc90: 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
bca0: 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70  e, pTab->nCol, p
bcb0: 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 65  Tab->aCol, pSele
bcc0: 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b  ct);.  pTab->iPK
bcd0: 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  ey = -1;.  if( d
bce0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
bcf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
bd00: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
bd10: 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ab);.    return 
bd20: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
bd30: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pTab;.}../*.** G
bd40: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
bd50: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
bd60: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
bd70: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
bd80: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
bd90: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
bda0: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
bdb0: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
bdc0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
bdd0: 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
bde0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
bdf0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
be00: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
be10: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
be20: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
be30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72   = sqlite3VdbeCr
be40: 65 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29  eate(pParse->db)
be50: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
be60: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20  _OMIT_TRACE.    
be70: 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 73  if( v ){.      s
be80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
be90: 28 76 2c 20 4f 50 5f 54 72 61 63 65 29 3b 0a 20  (v, OP_Trace);. 
bea0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
beb0: 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a    return v;.}...
bec0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
bed0: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
bee0: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
bef0: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
bf00: 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
bf10: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
bf20: 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69  ressions.  pLimi
bf30: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f  t and pOffset ho
bf40: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
bf50: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
bf60: 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
bf70: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
bf80: 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
bf90: 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
bfa0: 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
bfb0: 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
bfc0: 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
bfd0: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
bfe0: 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
bff0: 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
c000: 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
c010: 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
c020: 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
c030: 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
c040: 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
c050: 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
c060: 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
c070: 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
c080: 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
c090: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
c0a0: 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
c0b0: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
c0c0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
c0d0: 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
c0e0: 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
c0f0: 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
c100: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20  it and pOffset. 
c110: 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
c120: 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
c130: 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
c140: 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
c150: 66 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20  fault values.** 
c160: 28 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74  (usually but not
c170: 20 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f   always -1) prio
c180: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
c190: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e  s routine..** On
c1a0: 6c 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20  ly if pLimit!=0 
c1b0: 6f 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f  or pOffset!=0 do
c1c0: 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
c1d0: 74 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65  ters get.** rede
c1e0: 66 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f  fined.  The UNIO
c1f0: 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75  N ALL operator u
c200: 73 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74  ses this propert
c210: 79 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68  y to force.** th
c220: 65 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73  e reuse of the s
c230: 61 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  ame limit and of
c240: 66 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61  fset registers a
c250: 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a  cross multiple.*
c260: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
c270: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
c280: 6f 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  oid computeLimit
c290: 52 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20  Registers(Parse 
c2a0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
c2b0: 2a 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b  *p, int iBreak){
c2c0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a  .  Vdbe *v = 0;.
c2d0: 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30    int iLimit = 0
c2e0: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b  ;.  int iOffset;
c2f0: 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b  .  int addr1, n;
c300: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
c310: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
c320: 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31   .  ** "LIMIT -1
c330: 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61  " always shows a
c340: 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20  ll rows.  There 
c350: 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e  is some.  ** con
c360: 74 72 61 76 65 72 73 79 20 61 62 6f 75 74 20 77  traversy about w
c370: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
c380: 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20  behavior should 
c390: 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72  be..  ** The cur
c3a0: 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
c3b0: 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22  ion interprets "
c3c0: 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e  LIMIT 0" to mean
c3d0: 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20  .  ** no rows.. 
c3e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
c3f0: 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
c400: 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  se);.  assert( p
c410: 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20  ->pOffset==0 || 
c420: 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  p->pLimit!=0 );.
c430: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
c440: 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  ){.    p->iLimit
c450: 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50   = iLimit = ++pP
c460: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
c470: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
c480: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
c490: 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
c4a0: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 56 44  ) return;  /* VD
c4b0: 42 45 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  BE should have a
c4c0: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
c4d0: 63 61 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  cated */.    if(
c4e0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
c4f0: 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c  teger(p->pLimit,
c500: 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71   &n) ){.      sq
c510: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c520: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
c530: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
c540: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
c550: 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
c560: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ));.      if( n=
c570: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
c580: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c590: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  v, OP_Goto, 0, i
c5a0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65  Break);.      }e
c5b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
c5c0: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
c5d0: 20 28 64 6f 75 62 6c 65 29 6e 20 29 20 70 2d 3e   (double)n ) p->
c5e0: 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f  nSelectRow = (do
c5f0: 75 62 6c 65 29 6e 3b 0a 20 20 20 20 20 20 7d 0a  uble)n;.      }.
c600: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c610: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c620: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
c630: 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  it, iLimit);.   
c640: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c650: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
c660: 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  eInt, iLimit);. 
c670: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
c680: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
c690: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71  ter"));.      sq
c6a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c6b0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
c6c0: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  imit, iBreak);. 
c6d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
c6e0: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  pOffset ){.     
c6f0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f   p->iOffset = iO
c700: 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  ffset = ++pParse
c710: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50  ->nMem;.      pP
c720: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20  arse->nMem++;   
c730: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65  /* Allocate an e
c740: 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f  xtra register fo
c750: 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a  r limit+offset *
c760: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
c770: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c780: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66  p->pOffset, iOff
c790: 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
c7a0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
c7b0: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
c7c0: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56  Offset);.      V
c7d0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
c7e0: 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
c7f0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
c800: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c810: 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
c820: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
c830: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c840: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
c850: 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20   0, iOffset);.  
c860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
c870: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
c880: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c890: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c8a0: 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f  _Add, iLimit, iO
c8b0: 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31  ffset, iOffset+1
c8c0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
c8d0: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b  ment((v, "LIMIT+
c8e0: 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20  OFFSET"));.     
c8f0: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
c900: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
c910: 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b  _IfPos, iLimit);
c920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c930: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c940: 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66  nteger, -1, iOff
c950: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  set+1);.      sq
c960: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c970: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
c980: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
c990: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
c9a0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
c9b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
c9c0: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
c9d0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
c9e0: 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  r the iCol-th co
c9f0: 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72  lumn of.** the r
ca00: 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68  esult set for th
ca10: 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  e compound-selec
ca20: 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e  t statement "p".
ca30: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
ca40: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  .** the column h
ca50: 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  as no default co
ca60: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
ca70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
ca80: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
ca90: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  or the compound 
caa0: 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20  select is taken 
cab0: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74  from the.** left
cac0: 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68  -most term of th
cad0: 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61  e select that ha
cae0: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
caf0: 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
cb00: 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69  c CollSeq *multi
cb10: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61  SelectCollSeq(Pa
cb20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
cb30: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  ect *p, int iCol
cb40: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52  ){.  CollSeq *pR
cb50: 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  et;.  if( p->pPr
cb60: 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ior ){.    pRet 
cb70: 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
cb80: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
cb90: 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20  pPrior, iCol);. 
cba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74   }else{.    pRet
cbb0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
cbc0: 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20  rt( iCol>=0 );. 
cbd0: 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20   if( pRet==0 && 
cbe0: 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  iCol<p->pEList->
cbf0: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52 65  nExpr ){.    pRe
cc00: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
cc10: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
cc20: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
cc30: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
cc40: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
cc50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
cc60: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
cc70: 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77  LECT */../* Forw
cc80: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
cc90: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
cca0: 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
ccb0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
ccc0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
ccd0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
cce0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
ccf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
cd00: 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
cd10: 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
cd20: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
cd30: 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
cd40: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
cd50: 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b  ry results */.);
cd60: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
cd70: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
cd80: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69  SELECT./*.** Thi
cd90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
cda0: 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61  led to process a
cdb0: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
cdc0: 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  form from.** two
cdd0: 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74   or more separat
cde0: 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20  e queries using 
cdf0: 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c  UNION, UNION ALL
ce00: 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20  , EXCEPT, or.** 
ce10: 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20  INTERSECT.**.** 
ce20: 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  "p" points to th
ce30: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
ce40: 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e  the two queries.
ce50: 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74    the query on t
ce60: 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d  he.** left is p-
ce70: 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65  >pPrior.  The le
ce80: 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61  ft query could a
ce90: 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e  lso be a compoun
cea0: 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68  d query.** in wh
ceb0: 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f  ich case this ro
cec0: 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
ced0: 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
cee0: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  . .**.** The res
cef0: 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61  ults of the tota
cf00: 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62  l query are to b
cf10: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61  e written into a
cf20: 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20   destination.** 
cf30: 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69  of type eDest wi
cf40: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61  th parameter iPa
cf50: 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  rm..**.** Exampl
cf60: 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61  e 1:  Consider a
cf70: 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f   three-way compo
cf80: 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  und SQL statemen
cf90: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  t..**.**     SEL
cfa0: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e  ECT a FROM t1 UN
cfb0: 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ION SELECT b FRO
cfc0: 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
cfd0: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a  T c FROM t3.**.*
cfe0: 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
cff0: 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73   is parsed up as
d000: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
d010: 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
d020: 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a  M t3.**      |.*
d030: 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20  *      `----->  
d040: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
d050: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d060: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
d070: 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20         `------> 
d080: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
d090: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f  1.**.** The arro
d0a0: 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  ws in the diagra
d0b0: 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e  m above represen
d0c0: 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72  t the Select.pPr
d0d0: 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20  ior pointer..** 
d0e0: 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
d0f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
d100: 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65  h p equal to the
d110: 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a   t3 query, then.
d120: 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62  ** pPrior will b
d130: 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20  e the t2 query. 
d140: 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54   p->op will be T
d150: 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20  K_UNION in this 
d160: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69  case..**.** Noti
d170: 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  ce that because 
d180: 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74  of the way SQLit
d190: 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e  e parses compoun
d1a0: 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a  d SELECTs, the.*
d1b0: 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c  * individual sel
d1c0: 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75  ects always grou
d1d0: 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  p from left to r
d1e0: 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
d1f0: 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  int multiSelect(
d200: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d210: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
d220: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
d230: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
d240: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
d250: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
d260: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
d270: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
d280: 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
d290: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
d2a0: 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
d2b0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
d2c0: 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63  ITE_OK;   /* Suc
d2d0: 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61  cess code from a
d2e0: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
d2f0: 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b   Select *pPrior;
d300: 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65         /* Anothe
d310: 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61  r SELECT immedia
d320: 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74  tely to our left
d330: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
d340: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
d350: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
d360: 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53  this VDBE */.  S
d370: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
d380: 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
d390: 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61  ive data destina
d3a0: 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
d3b0: 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20   *pDelete = 0;  
d3c0: 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70  /* Chain of simp
d3d0: 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65  le selects to de
d3e0: 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lete */.  sqlite
d3f0: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
d400: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
d410: 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65  ection */.#ifnde
d420: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
d430: 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62  PLAIN.  int iSub
d440: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
d450: 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d   EQP id of left-
d460: 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  hand query */.  
d470: 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20  int iSub2;      
d480: 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
d490: 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75  of right-hand qu
d4a0: 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ery */.#endif.. 
d4b0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
d4c0: 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
d4d0: 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75  BY or LIMIT clau
d4e0: 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45  se on prior SELE
d4f0: 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20  CTs.  Only.  ** 
d500: 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d  the last (right-
d510: 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20  most) SELECT in 
d520: 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68  the series may h
d530: 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
d540: 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20  or LIMIT..  */. 
d550: 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d   assert( p && p-
d560: 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43  >pPrior );  /* C
d570: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
d580: 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20  guarantees this 
d590: 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20 3d 20 70  much */.  db = p
d5a0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72  Parse->db;.  pPr
d5b0: 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
d5c0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
d5d0: 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70  r->pRightmost!=p
d5e0: 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72  Prior );.  asser
d5f0: 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68  t( pPrior->pRigh
d600: 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74  tmost==p->pRight
d610: 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73 74 20 3d  most );.  dest =
d620: 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70   *pDest;.  if( p
d630: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
d640: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d650: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
d660: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
d670: 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
d680: 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
d690: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
d6a0: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
d6b0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
d6c0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
d6d0: 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  nd;.  }.  if( pP
d6e0: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
d6f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d700: 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49  Msg(pParse,"LIMI
d710: 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  T clause should 
d720: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
d730: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
d740: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
d750: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
d760: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
d770: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d780: 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  }..  v = sqlite3
d790: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d7a0: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
d7b0: 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20  );  /* The VDBE 
d7c0: 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20  already created 
d7d0: 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  by calling funct
d7e0: 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65  ion */..  /* Cre
d7f0: 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
d800: 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
d810: 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
d820: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
d830: 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  .eDest==SRT_Ephe
d840: 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  mTab ){.    asse
d850: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
d860: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d870: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
d880: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74  nEphemeral, dest
d890: 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c  .iSDParm, p->pEL
d8a0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
d8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
d8c0: 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e  geP5(v, BTREE_UN
d8d0: 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65  ORDERED);.    de
d8e0: 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54  st.eDest = SRT_T
d8f0: 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  able;.  }..  /* 
d900: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45  Make sure all SE
d910: 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61  LECTs in the sta
d920: 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20  tement have the 
d930: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65  same number of e
d940: 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20  lements.  ** in 
d950: 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74  their result set
d960: 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
d970: 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ( p->pEList && p
d980: 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b  Prior->pEList );
d990: 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
d9a0: 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d  ->nExpr!=pPrior-
d9b0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
d9c0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  {.    if( p->sel
d9d0: 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
d9e0: 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
d9f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
da00: 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d  e, "all VALUES m
da10: 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ust have the sam
da20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  e number of term
da30: 73 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s");.    }else{.
da40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
da50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53  orMsg(pParse, "S
da60: 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65  ELECTs to the le
da70: 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20  ft and right of 
da80: 25 73 22 0a 20 20 20 20 20 20 20 20 22 20 64 6f  %s".        " do
da90: 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
daa0: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
dab0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
dac0: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
dad0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ));.    }.    rc
dae0: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
daf0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
db00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f  .  }..  /* Compo
db10: 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74  und SELECTs that
db20: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
db30: 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e  Y clause are han
db40: 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  dled separately.
db50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
db60: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72  OrderBy ){.    r
db70: 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
db80: 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c  tOrderBy(pParse,
db90: 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a   p, pDest);.  }.
dba0: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
dbb0: 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ode for the left
dbc0: 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43   and right SELEC
dbd0: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
dbe0: 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  */.  switch( p->
dbf0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
dc00: 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  K_ALL: {.      i
dc10: 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
dc20: 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20     int nLimit;. 
dc30: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
dc40: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
dc50: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
dc60: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
dc70: 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
dc80: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
dc90: 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c  fset;.      expl
dca0: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
dcb0: 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
dcc0: 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
dcd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
dce0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
dcf0: 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20  rior, &dest);.  
dd00: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
dd10: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  0;.      p->pOff
dd20: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
dd30: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
dd40: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
dd50: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
dd60: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
dd70: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  = 0;.      p->iL
dd80: 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
dd90: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
dda0: 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
ddb0: 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
ddc0: 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
ddd0: 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  {.        addr =
dde0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ddf0: 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p1(v, OP_IfZero,
de00: 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20   p->iLimit);.   
de10: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
de20: 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64  ((v, "Jump ahead
de30: 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65   if LIMIT reache
de40: 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d"));.      }.  
de50: 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
de60: 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
de70: 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
de80: 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
de90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
dea0: 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
deb0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
dec0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ded0: 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
dee0: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
def0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
df00: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
df10: 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50  nSelectRow += pP
df20: 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
df30: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
df40: 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20  or->pLimit.     
df50: 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
df60: 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72  IsInteger(pPrior
df70: 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69  ->pLimit, &nLimi
df80: 74 29 0a 20 20 20 20 20 20 20 26 26 20 70 2d 3e  t).       && p->
df90: 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 64 6f  nSelectRow > (do
dfa0: 75 62 6c 65 29 6e 4c 69 6d 69 74 20 0a 20 20 20  uble)nLimit .   
dfb0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d     ){.        p-
dfc0: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64  >nSelectRow = (d
dfd0: 6f 75 62 6c 65 29 6e 4c 69 6d 69 74 3b 0a 20 20  ouble)nLimit;.  
dfe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
dff0: 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
e000: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
e010: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
e020: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
e030: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e040: 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
e050: 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
e060: 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
e070: 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
e080: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
e090: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
e0a0: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
e0b0: 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d  */.      u8 op =
e0c0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
e0d0: 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
e0e0: 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
e0f0: 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
e100: 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
e110: 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
e120: 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
e130: 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
e140: 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
e150: 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
e160: 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
e170: 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
e180: 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
e190: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
e1a0: 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
e1b0: 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
e1c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
e1d0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
e1e0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
e1f0: 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  se( p->op==TK_UN
e200: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69  ION );.      pri
e210: 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e  orOp = SRT_Union
e220: 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
e230: 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20  .eDest==priorOp 
e240: 26 26 20 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c  && ALWAYS(!p->pL
e250: 69 6d 69 74 20 26 26 21 70 2d 3e 70 4f 66 66 73  imit &&!p->pOffs
e260: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  et) ){.        /
e270: 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
e280: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
e290: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
e2a0: 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
e2b0: 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
e2c0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
e2d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
e2e0: 69 67 68 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20  ightmost!=p );  
e2f0: 2f 2a 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70  /* Can only happ
e300: 65 6e 20 66 6f 72 20 6c 65 66 74 77 61 72 64 20  en for leftward 
e310: 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 20 20 20  elements.       
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
e340: 20 6f 66 20 61 20 33 2d 77 61 79 20 6f 72 20 6d   of a 3-way or m
e350: 6f 72 65 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a  ore compound */.
e360: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e370: 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20  p->pLimit==0 ); 
e380: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
e390: 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
e3a0: 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
e3b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e3c0: 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
e3d0: 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
e3e0: 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
e3f0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
e400: 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
e410: 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  iSDParm;.      }
e420: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
e430: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
e440: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
e450: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
e460: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
e470: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
e480: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
e490: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
e4a0: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
e4b0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
e4c0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
e4d0: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
e4e0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
e4f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e500: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
e510: 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
e520: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e530: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
e540: 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
e550: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
e560: 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
e570: 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68          p->pRigh
e580: 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20  tmost->selFlags 
e590: 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
e5a0: 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ral;.        ass
e5b0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
e5c0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
e5d0: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
e5e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
e5f0: 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
e600: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
e610: 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
e620: 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  rBy );.      sql
e630: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
e640: 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
e650: 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
e660: 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
e670: 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
e680: 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
e690: 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
e6a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
e6b0: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
e6c0: 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  r, &uniondest);.
e6d0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
e6e0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
e6f0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
e700: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
e710: 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
e720: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
e730: 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
e740: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
e750: 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20  EXCEPT ){.      
e760: 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
e770: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
e780: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e790: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
e7a0: 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  );.        op = 
e7b0: 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
e7c0: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
e7d0: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
e7e0: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
e7f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
e800: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
e810: 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
e820: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
e830: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  set = 0;.      u
e840: 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
e850: 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61   op;.      expla
e860: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
e870: 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
e880: 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
e890: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
e8a0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
e8b0: 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
e8c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
e8d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
e8e0: 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
e8f0: 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
e900: 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
e910: 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
e920: 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
e930: 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
e940: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
e950: 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
e960: 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
e970: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
e980: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
e990: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
e9a0: 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
e9b0: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
e9c0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
e9d0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
e9e0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
e9f0: 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
ea00: 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c  _UNION ) p->nSel
ea10: 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72  ectRow += pPrior
ea20: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
ea30: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
ea40: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
ea50: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
ea60: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
ea70: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
ea80: 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
ea90: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b    p->iLimit = 0;
eaa0: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
eab0: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  t = 0;..      /*
eac0: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74   Convert the dat
ead0: 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  a in the tempora
eae0: 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  ry table into wh
eaf0: 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20  atever form.    
eb00: 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
eb10: 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
eb20: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
eb30: 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54    assert( unionT
eb40: 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d  ab==dest.iSDParm
eb50: 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
eb60: 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
eb70: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21   if( dest.eDest!
eb80: 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
eb90: 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
eba0: 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
ebb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ebc0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
ebd0: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
ebe0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
ebf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
ec00: 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
ec10: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
ec20: 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
ec30: 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
ec40: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
ec50: 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
ec60: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
ec70: 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
ec80: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
ec90: 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
eca0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
ecb0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
ecc0: 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
ecd0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ece0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
ecf0: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
ed00: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
ed10: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
ed20: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ed30: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
ed40: 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20  nTab, iBreak);. 
ed50: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
ed60: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
ed70: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
ed80: 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
ed90: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
eda0: 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61  >pEList, unionTa
edb0: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  b, p->pEList->nE
edc0: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
ede0: 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74  -1, &dest, iCont
edf0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
ee00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
ee10: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
ee20: 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ont);.        sq
ee30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ee40: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f  v, OP_Next, unio
ee50: 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 0a 20  nTab, iStart);. 
ee60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ee70: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
ee80: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
ee90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
eea0: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
eeb0: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
eec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
eed0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
eee0: 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
eef0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  p->op==TK_INTERS
ef00: 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ECT ); {.      i
ef10: 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20  nt tab1, tab2;. 
ef20: 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20       int iCont, 
ef30: 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a  iBreak, iStart;.
ef40: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
ef50: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20  it, *pOffset;.  
ef60: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
ef70: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 69      SelectDest i
ef80: 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20  ntersectdest;.  
ef90: 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20      int r1;..   
efa0: 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
efb0: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
efc0: 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
efd0: 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
efe0: 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70       ** two temp
eff0: 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48  orary tables.  H
f000: 65 6e 63 65 20 69 74 20 68 61 73 20 69 74 73 20  ence it has its 
f010: 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e  own case.  Begin
f020: 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c  .      ** by all
f030: 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c  ocating the tabl
f040: 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e  es we will need.
f050: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f060: 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab1 = pParse->n
f070: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62  Tab++;.      tab
f080: 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
f090: 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
f0a0: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
f0b0: 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20   );..      addr 
f0c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f0d0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
f0e0: 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30  hemeral, tab1, 0
f0f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f100: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
f110: 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
f120: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
f130: 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
f140: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
f150: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  t->selFlags |= S
f160: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
f170: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f180: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
f190: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
f1a0: 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
f1b0: 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
f1c0: 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
f1d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
f1e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
f1f0: 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64  Init(&intersectd
f200: 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  est, SRT_Union, 
f210: 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70  tab1);.      exp
f220: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
f230: 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
f240: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
f250: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f260: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
f270: 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
f280: 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  tdest);.      if
f290: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
f2a0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f2b0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
f2c0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
f2d0: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
f2e0: 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
f2f0: 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
f300: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
f310: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f320: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
f330: 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
f340: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
f350: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
f360: 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
f370: 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
f380: 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
f390: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
f3a0: 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
f3b0: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
f3c0: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
f3d0: 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
f3e0: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
f3f0: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
f400: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72  = 0;.      inter
f410: 73 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d  sectdest.iSDParm
f420: 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65   = tab2;.      e
f430: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
f440: 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
f450: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
f460: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f470: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
f480: 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65   p, &intersectde
f490: 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
f4a0: 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
f4b0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
f4c0: 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
f4d0: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
f4e0: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
f4f0: 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
f500: 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  ow>pPrior->nSele
f510: 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
f520: 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
f530: 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
f540: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
f550: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
f560: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
f570: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
f580: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
f590: 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20   pOffset;..     
f5a0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
f5b0: 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
f5c0: 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
f5d0: 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
f5e0: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
f5f0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f600: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
f610: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t );.      if( d
f620: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
f630: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
f640: 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
f650: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = p;.        whi
f660: 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
f670: 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
f680: 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
f690: 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
f6a0: 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
f6b0: 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
f6c0: 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
f6d0: 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
f6e0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
f6f0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
f700: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
f710: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
f720: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
f730: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
f740: 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
f750: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f760: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
f770: 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
f780: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
f790: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
f7a0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53  Parse);.      iS
f7b0: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
f7c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
f7d0: 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29  owKey, tab1, r1)
f7e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f7f0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
f800: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
f810: 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29  2, iCont, r1, 0)
f820: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
f830: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
f840: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
f850: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
f860: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
f870: 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e  EList, tab1, p->
f880: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8a0: 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73       0, -1, &des
f8b0: 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
f8c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f8d0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
f8e0: 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
f8f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f900: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
f910: 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a 20  tab1, iStart);. 
f920: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f930: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
f940: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
f950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f960: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
f970: 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  b2, 0);.      sq
f980: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f990: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
f9a0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
f9b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
f9c0: 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
f9d0: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
f9e0: 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 70   iSub1, iSub2, p
f9f0: 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a  ->op!=TK_ALL);..
fa00: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
fa10: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
fa20: 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
fa30: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
fa40: 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
fa50: 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ent the compound
fa60: 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74   select..  ** At
fa70: 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f  tach the KeyInfo
fa80: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c   structure to al
fa90: 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  l temporary tabl
faa0: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
fab0: 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
fac0: 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
fad0: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
fae0: 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
faf0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fb00: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
fb10: 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
fb20: 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
fb30: 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
fb40: 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
fb50: 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
fb60: 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
fb70: 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
fb80: 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
fb90: 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
fba0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
fbb0: 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70  lags & SF_UsesEp
fbc0: 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69  hemeral ){.    i
fbd0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fbf0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
fc00: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
fc10: 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
fc20: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
fc30: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
fc40: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
fc50: 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
fc80: 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
fc90: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
fca0: 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
fcb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
fcc0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
fcd0: 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
fce0: 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  Coll[] */.    in
fcf0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
fd10: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
fd20: 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a   in result set *
fd30: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
fd40: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20  ->pRightmost==p 
fd50: 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
fd60: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
fd70: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
fd80: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
fd90: 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20  ro(db,.         
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
fdb0: 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b  zeof(*pKeyInfo)+
fdc0: 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  nCol*(sizeof(Col
fdd0: 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20  lSeq*) + 1));.  
fde0: 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
fdf0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
fe00: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
fe10: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
fe20: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
fe30: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e      pKeyInfo->en
fe40: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
fe50: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
fe60: 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 0a  d = (u16)nCol;..
fe70: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
fe80: 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
fe90: 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
fea0: 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
feb0: 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
fec0: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
fed0: 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
fee0: 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
fef0: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
ff00: 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
ff10: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
ff20: 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 49 6e      }.    pKeyIn
ff30: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  fo->aSortOrder =
ff40: 20 28 75 38 2a 29 61 70 43 6f 6c 6c 3b 0a 0a 20   (u8*)apColl;.. 
ff50: 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
ff60: 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
ff70: 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
ff80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
ff90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
ffa0: 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d  nt addr = pLoop-
ffb0: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
ffc0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
ffd0: 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  dr<0 ){.        
ffe0: 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75    /* If [0] is u
fff0: 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69  nused then [1] i
10000 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20  s also unused.  
10010 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20  So we can.      
10020 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61      ** always sa
10030 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f  fely abort as so
10040 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20  on as the first 
10050 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66  unused slot is f
10060 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
10070 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
10080 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
10090 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  <0 );.          
100a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
100b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
100c0 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
100d0 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  addr, nCol);.   
100e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
100f0 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
10100 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
10110 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
10120 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
10130 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d  ddrOpenEphm[i] =
10140 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
10150 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
10160 46 72 65 65 28 64 62 2c 20 70 4b 65 79 49 6e 66  Free(db, pKeyInf
10170 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73  o);.  }..multi_s
10180 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65  elect_end:.  pDe
10190 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74  st->iSdst = dest
101a0 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d  .iSdst;.  pDest-
101b0 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53  >nSdst = dest.nS
101c0 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  dst;.  sqlite3Se
101d0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
101e0 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72  Delete);.  retur
101f0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
10200 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
10210 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
10220 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
10230 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
10240 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e  e for a coroutin
10250 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
10260 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   of a.** SELECT 
10270 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  statment..**.** 
10280 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f  The data to be o
10290 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e  utput is contain
102a0 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74  ed in pIn->iSdst
102b0 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20  .  There are.** 
102c0 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d  pIn->nSdst colum
102d0 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  ns to be output.
102e0 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65    pDest is where
102f0 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75   the output shou
10300 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a  ld.** be sent..*
10310 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69  *.** regReturn i
10320 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
10330 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  the register hol
10340 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74  ding the subrout
10350 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64  ine.** return ad
10360 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dress..**.** If 
10370 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69  regPrev>0 then i
10380 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72  t is the first r
10390 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63  egister in a vec
103a0 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f  tor that.** reco
103b0 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  rds the previous
103c0 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65   output.  mem[re
103d0 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67  gPrev] is a flag
103e0 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a   that is false.*
103f0 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62  * if there has b
10400 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20  een no previous 
10410 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50  output.  If regP
10420 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20  rev>0 then code 
10430 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  is.** generated 
10440 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c  to suppress dupl
10450 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66  icates.  pKeyInf
10460 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f  o is used for co
10470 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e  mparing.** keys.
10480 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49  .**.** If the LI
10490 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e  MIT found in p->
104a0 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65  iLimit is reache
104b0 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  d, jump immediat
104c0 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b  ely to.** iBreak
104d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
104e0 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
104f0 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73  broutine(.  Pars
10500 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
10510 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
10520 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
10530 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
10540 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
10550 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
10560 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e   SelectDest *pIn
10570 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f  ,        /* Coro
10580 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20  utine supplying 
10590 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
105a0 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
105b0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65    /* Where to se
105c0 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20  nd the data */. 
105d0 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20   int regReturn, 
105e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
105f0 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  return address r
10600 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
10610 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20   regPrev,       
10620 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
10630 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
10640 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73  .  No uniqueness
10650 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e   if 0 */.  KeyIn
10660 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
10670 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72     /* For compar
10680 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75  ing with previou
10690 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  s entry */.  int
106a0 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20   p4type,        
106b0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34 20 74       /* The p4 t
106c0 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e 66 6f  ype for pKeyInfo
106d0 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
106f0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65   Jump here if we
10700 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a   hit the LIMIT *
10710 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
10720 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
10730 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b    int iContinue;
10740 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20  .  int addr;..  
10750 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
10760 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
10770 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  ;.  iContinue = 
10780 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
10790 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53  abel(v);..  /* S
107a0 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
107b0 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58  es for UNION, EX
107c0 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
107d0 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ECT .  */.  if( 
107e0 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69  regPrev ){.    i
107f0 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a  nt j1, j2;.    j
10800 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
10810 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
10820 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  t, regPrev);.   
10830 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
10840 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
10850 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73  mpare, pIn->iSds
10860 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  t, regPrev+1, pI
10870 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20  n->nSdst,.      
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10890 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
108a0 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29  KeyInfo, p4type)
108b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
108c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
108d0 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69  mp, j2+2, iConti
108e0 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20  nue, j2+2);.    
108f0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10900 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
10910 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
10920 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  opy(pParse, pIn-
10930 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
10940 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  1, pIn->nSdst);.
10950 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10960 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
10970 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29  ger, 1, regPrev)
10980 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
10990 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
109a0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
109b0 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
109c0 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
109d0 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72   entries if ther
109e0 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63  e is an OFFSET c
109f0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64  lause.  */.  cod
10a00 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43  eOffset(v, p, iC
10a10 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69  ontinue);..  swi
10a20 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
10a30 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
10a40 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
10a50 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
10a60 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
10a70 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
10a80 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
10a90 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
10aa0 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
10ab0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
10ac0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
10ad0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
10ae0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
10af0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10b00 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
10b10 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  RT_Table );.    
10b20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73    testcase( pDes
10b30 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
10b40 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
10b50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10b60 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
10b70 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  rd, pIn->iSdst, 
10b80 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b  pIn->nSdst, r1);
10b90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10ba0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
10bb0 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e  ewRowid, pDest->
10bc0 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  iSDParm, r2);.  
10bd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10be0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
10bf0 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  rt, pDest->iSDPa
10c00 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
10c10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
10c20 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
10c30 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
10c40 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
10c50 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
10c60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10c70 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
10c80 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
10c90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
10ca0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10cb0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
10cc0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
10cd0 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
10ce0 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
10cf0 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
10d00 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
10d10 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
10d20 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
10d30 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
10d40 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
10d50 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
10d60 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
10d70 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
10d80 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
10d90 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t: {.      int r
10da0 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
10db0 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29   pIn->nSdst==1 )
10dc0 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61  ;.      pDest->a
10dd0 66 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20  ffSdst = .      
10de0 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
10df0 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c  eAffinity(p->pEL
10e00 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
10e10 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
10e20 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
10e30 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
10e40 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
10e50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
10e60 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
10e70 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c  , pIn->iSdst, 1,
10e80 20 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66   r1, &pDest->aff
10e90 53 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73  Sdst,1);.      s
10ea0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
10eb0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
10ec0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
10ed0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
10ee0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10ef0 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70   OP_IdxInsert, p
10f00 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
10f10 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
10f20 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
10f30 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
10f40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10f50 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72  .#if 0  /* Never
10f60 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52   occurs on an OR
10f70 44 45 52 20 42 59 20 71 75 65 72 79 20 2a 2f 0a  DER BY query */.
10f80 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f      /* If any ro
10f90 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 72  w exist in the r
10fa0 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72  esult set, recor
10fb0 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64 20  d that fact and 
10fc0 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  abort..    */.  
10fd0 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73 74    case SRT_Exist
10fe0 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s: {.      sqlit
10ff0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11000 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70  OP_Integer, 1, p
11010 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
11020 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
11030 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
11040 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
11050 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
11060 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
11070 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
11080 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
11090 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
110a0 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
110b0 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
110c0 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
110d0 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
110e0 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
110f0 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
11100 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
11110 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
11120 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
11130 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
11140 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d  ert( pIn->nSdst=
11150 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
11160 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
11170 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
11180 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  st, pDest->iSDPa
11190 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a  rm, 1);.      /*
111a0 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
111b0 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
111c0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
111d0 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
111e0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
111f0 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
11200 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
11210 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  */..    /* The r
11220 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
11230 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
11240 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
11250 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
11260 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54  pDest->iSdst.  T
11270 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  hen the co-routi
11280 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a  ne yields..    *
11290 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  /.    case SRT_C
112a0 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  oroutine: {.    
112b0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64    if( pDest->iSd
112c0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
112d0 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
112e0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
112f0 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
11300 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  >nSdst);.       
11310 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
11320 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20  pIn->nSdst;.    
11330 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
11340 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
11350 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
11360 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
11370 70 44 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a 20  pDest->nSdst);. 
11380 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11390 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
113a0 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
113b0 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rm);.      break
113c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
113d0 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61  If none of the a
113e0 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72  bove, then the r
113f0 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f  esult destinatio
11400 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a  n must be.    **
11410 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68   SRT_Output.  Th
11420 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
11430 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
11440 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  any other.    **
11450 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68   destination oth
11460 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73  er than the ones
11470 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f   handled above o
11480 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20  r SRT_Output..  
11490 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20    **.    ** For 
114a0 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75  SRT_Output, resu
114b0 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
114c0 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
114d0 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20  registers.  .   
114e0 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f   ** Then the OP_
114f0 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65  ResultRow opcode
11500 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73   is used to caus
11510 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
11520 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72   to.    ** retur
11530 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f  n the next row o
11540 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f  f result..    */
11550 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
11560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
11570 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
11580 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
11590 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
115a0 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
115b0 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  w, pIn->iSdst, p
115c0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
115d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
115e0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
115f0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
11600 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
11610 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11620 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a     }.  }..  /* J
11630 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
11640 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
11650 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
11660 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
11670 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
11680 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11690 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  3(v, OP_IfZero, 
116a0 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
116b0 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  k, -1);.  }..  /
116c0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73  * Generate the s
116d0 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  ubroutine return
116e0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
116f0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
11700 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
11710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11720 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
11730 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20   regReturn);..  
11740 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
11750 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76  /*.** Alternativ
11760 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
11770 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  t code generator
11780 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20   for cases when 
11790 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f  there.** is an O
117a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
117b0 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20  **.** We assume 
117c0 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  a query of the f
117d0 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a  ollowing form:.*
117e0 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63  *.**      <selec
117f0 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20  tA>  <operator> 
11800 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45   <selectB>  ORDE
11810 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73  R BY <orderbylis
11820 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74  t>.**.** <operat
11830 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e  or> is one of UN
11840 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20  ION ALL, UNION, 
11850 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
11860 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a  SECT.  The idea.
11870 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f  ** is to code bo
11880 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64  th <selectA> and
11890 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20   <selectB> with 
118a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
118b0 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75  use as.** co-rou
118c0 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e  tines.  Then run
118d0 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73   the co-routines
118e0 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64   in parallel and
118f0 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c   merge the resul
11900 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f  ts.** into the o
11910 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74  utput.  In addit
11920 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63  ion to the two c
11930 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65  oroutines (calle
11940 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a  d selectA and.**
11950 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20   selectB) there 
11960 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65  are 7 subroutine
11970 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41  s:.**.**    outA
11980 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
11990 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
119a0 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctA coroutine in
119b0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
119d0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
119e0 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  ry..**.**    out
119f0 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  B:    Move the o
11a00 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
11a10 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectB coroutine i
11a20 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
11a30 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
11a40 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
11a50 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65  ery.  (Only gene
11a60 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20  rated for UNION 
11a70 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
11a80 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45     UNION ALL.  E
11a90 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54  XCEPT and INSERT
11aa0 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75  SECT never outpu
11ab0 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20  t a row that.** 
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65              appe
11ad0 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a  ars only in B.).
11ae0 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20  **.**    AltB:  
11af0 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68    Called when th
11b00 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d  ere is data from
11b10 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73   both coroutines
11b20 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20   and A<B..**.** 
11b30 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c     AeqB:    Call
11b40 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
11b50 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
11b60 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
11b70 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67  ==B..**.**    Ag
11b80 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  tB:    Called wh
11b90 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61  en there is data
11ba0 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75   from both corou
11bb0 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a  tines and A>B..*
11bc0 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20  *.**    EofA:   
11bd0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
11be0 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
11bf0 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a  rom selectA..**.
11c00 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43  **    EofB:    C
11c10 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
11c20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
11c30 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a  m selectB..**.**
11c40 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
11c50 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65  ion of the latte
11c60 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e  r five subroutin
11c70 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69  es depend on whi
11c80 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  ch .** <operator
11c90 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a  > is used:.**.**
11ca0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11cb0 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20  UNION ALL       
11cc0 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20    UNION         
11cd0 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20     EXCEPT       
11ce0 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20     INTERSECT.** 
11cf0 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
11d00 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
11d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
11d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
11d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
11d40 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20    AltB:   outA, 
11d50 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
11d60 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
11d70 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
11d80 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
11d90 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  eqB:   outA, nex
11da0 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78               nex
11dc0 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c  tA         outA,
11dd0 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41   nextA.**.**   A
11de0 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  gtB:   outB, nex
11df0 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
11e00 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78  xtB          nex
11e10 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  tB            ne
11e20 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41  xtB.**.**   EofA
11e30 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
11e40 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
11e50 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20            halt  
11e60 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a             halt.
11e70 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20  **.**   EofB:   
11e80 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
11e90 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
11ea0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
11eb0 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
11ec0 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41  * In the AltB, A
11ed0 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75  eqB, and AgtB su
11ee0 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f  broutines, an EO
11ef0 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67  F on A following
11f00 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73   nextA.** causes
11f10 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
11f20 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61  mp to EofA and a
11f30 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f  n EOF on B follo
11f40 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65  wing nextB cause
11f50 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74  s.** an immediat
11f60 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20  e jump to EofB. 
11f70 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64   Within EofA and
11f80 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f   EofB, and EOF o
11f90 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f  n entry or.** fo
11fa0 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61  llowing nextX ca
11fb0 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74  uses a jump to t
11fc0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65  he end of the se
11fd0 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e  lect processing.
11fe0 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65  .**.** Duplicate
11ff0 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20   removal in the 
12000 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
12010 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73  nd INTERSECT cas
12020 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a  es is handled.**
12030 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70   within the outp
12040 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ut subroutine.  
12050 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69  The regPrev regi
12060 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74  ster set holds t
12070 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  he previously.**
12080 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20   output value.  
12090 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  A comparison is 
120a0 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69  made against thi
120b0 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  s value and the 
120c0 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69  output.** is ski
120d0 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74  pped if the next
120e0 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62   results would b
120f0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
12100 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a  e previous..**.*
12110 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
12120 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20  tion plan is to 
12130 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77  implement the tw
12140 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  o coroutines and
12150 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75   seven.** subrou
12160 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65  tines first, the
12170 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f  n put the contro
12180 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62  l logic at the b
12190 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69  ottom.  Like thi
121a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
121b0 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20    goto Init.**  
121c0 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e     coA: coroutin
121d0 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79  e for left query
121e0 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a   (A).**     coB:
121f0 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
12200 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a  ight query (B).*
12210 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75  *    outA: outpu
12220 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a  t one row of A.*
12230 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75  *    outB: outpu
12240 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28  t one row of B (
12250 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20  UNION and UNION 
12260 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20  ALL only).**    
12270 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofA: ....**    
12280 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  EofB: ....**    
12290 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AltB: ....**    
122a0 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AeqB: ....**    
122b0 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20  AgtB: ....**    
122c0 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65  Init: initialize
122d0 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73   coroutine regis
122e0 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ters.**         
122f0 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20   yield coA.**   
12300 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29         if eof(A)
12310 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20   goto EofA.**   
12320 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42         yield coB
12330 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20  .**          if 
12340 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42  eof(B) goto EofB
12350 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d  .**    Cmpr: Com
12360 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20  pare A, B.**    
12370 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c        Jump AltB,
12380 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20   AeqB, AgtB.**  
12390 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a     End: ....**.*
123a0 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20  * We call AltB, 
123b0 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41  AeqB, AgtB, EofA
123c0 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72  , and EofB "subr
123d0 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65  outines" but the
123e0 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74  y are not.** act
123f0 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69  ually called usi
12400 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65  ng Gosub and the
12410 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e  y do not Return.
12420 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20    EofA and EofB 
12430 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c  loop.** until al
12440 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73  l data is exhaus
12450 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  ted then jump to
12460 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e   the "end" labe.
12470 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a    AltB, AeqB,.**
12480 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74   and AgtB jump t
12490 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74  o either L2 or t
124a0 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72  o one of EofA or
124b0 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65   EofB..*/.#ifnde
124c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
124d0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74  MPOUND_SELECT.st
124e0 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
124f0 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
12500 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12510 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
12520 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
12530 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
12540 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
12550 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
12560 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
12570 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
12580 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
12590 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
125a0 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
125b0 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
125c0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
125d0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65  unters */.  Sele
125e0 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
125f0 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
12600 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
12610 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
12620 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
12630 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
12640 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
12650 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
12660 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20  Dest destA;     
12670 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66  /* Destination f
12680 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a  or coroutine A *
12690 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
126a0 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73  estB;     /* Des
126b0 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
126c0 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e  outine B */.  in
126d0 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20  t regAddrA;     
126e0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
126f0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
12700 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
12710 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 41 3b  /.  int regEofA;
12720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
12730 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  g to indicate wh
12740 65 6e 20 73 65 6c 65 63 74 2d 41 20 69 73 20 63  en select-A is c
12750 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74  omplete */.  int
12760 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20   regAddrB;      
12770 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
12780 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
12790 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
127a0 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 42 3b 20  .  int regEofB; 
127b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
127c0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65   to indicate whe
127d0 6e 20 73 65 6c 65 63 74 2d 42 20 69 73 20 63 6f  n select-B is co
127e0 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  mplete */.  int 
127f0 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20  addrSelectA;    
12800 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
12810 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  the select-A cor
12820 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
12830 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20  addrSelectB;    
12840 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
12850 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  the select-B cor
12860 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
12870 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20  regOutA;        
12880 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
12890 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
128a0 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
128b0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
128c0 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tB;          /* 
128d0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
128e0 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
128f0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
12900 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20    int addrOutA; 
12910 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
12920 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ss of the output
12930 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
12940 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20  .  int addrOutB 
12950 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  = 0;     /* Addr
12960 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
12970 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
12980 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
12990 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
129a0 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
129b0 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73  ct-A-exhausted s
129c0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
129d0 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20  nt addrEofB;    
129e0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
129f0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d  of the select-B-
12a00 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
12a10 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
12a20 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20  drAltB;         
12a30 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
12a40 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65  e A<B subroutine
12a50 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65   */.  int addrAe
12a60 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  qB;         /* A
12a70 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d  ddress of the A=
12a80 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  =B subroutine */
12a90 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b  .  int addrAgtB;
12aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
12ab0 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73  ess of the A>B s
12ac0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
12ad0 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20  nt regLimitA;   
12ae0 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
12af0 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
12b00 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
12b10 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f  LimitB;        /
12b20 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72  * Limit register
12b30 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f   for select-A */
12b40 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20  .  int regPrev; 
12b50 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61           /* A ra
12b60 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
12b70 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75   to hold previou
12b80 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  s output */.  in
12b90 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20  t savedLimit;   
12ba0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
12bb0 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20  ue of p->iLimit 
12bc0 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66  */.  int savedOf
12bd0 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61  fset;      /* Sa
12be0 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
12bf0 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74  iOffset */.  int
12c00 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20   labelCmpr;     
12c10 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
12c20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
12c30 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d   merge algorithm
12c40 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45   */.  int labelE
12c50 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  nd;         /* L
12c60 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64  abel for the end
12c70 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20   of the overall 
12c80 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20  SELECT stmt */. 
12c90 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20   int j1;        
12ca0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69         /* Jump i
12cb0 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
12cc0 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64   get retargetted
12cd0 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20   */.  int op;   
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12cf0 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b  ne of TK_ALL, TK
12d00 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
12d10 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  T, TK_INTERSECT 
12d20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
12d30 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f  eyDup = 0; /* Co
12d40 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61  mparison informa
12d50 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
12d60 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20  te removal */.  
12d70 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72  KeyInfo *pKeyMer
12d80 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69  ge;   /* Compari
12d90 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  son information 
12da0 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73  for merging rows
12db0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
12dc0 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
12dd0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12de0 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  on */.  ExprList
12df0 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a   *pOrderBy;   /*
12e00 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
12e10 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ause */.  int nO
12e20 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
12e30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
12e40 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
12e50 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
12e60 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20  nt *aPermute;   
12e70 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20       /* Mapping 
12e80 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65  from ORDER BY te
12e90 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65  rms to result se
12ea0 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66  t columns */.#if
12eb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12ec0 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
12ed0 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20  Sub1;           
12ee0 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
12ef0 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
12f00 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20  .  int iSub2;   
12f10 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
12f20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
12f30 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
12f40 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
12f50 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
12f60 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d  assert( pKeyDup=
12f70 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65  =0 ); /* "Manage
12f80 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68  d" code needs th
12f90 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38  is.  Ticket #338
12fa0 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  2. */.  db = pPa
12fb0 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70  rse->db;.  v = p
12fc0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
12fd0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
12fe0 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79        /* Already
12ff0 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f   thrown the erro
13000 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20  r if VDBE alloc 
13010 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65  failed */.  labe
13020 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  lEnd = sqlite3Vd
13030 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
13040 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71    labelCmpr = sq
13050 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
13060 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61  el(v);...  /* Pa
13070 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52  tch up the ORDER
13080 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a   BY clause.  */.
13090 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a    op = p->op;  .
130a0 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
130b0 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rior;.  assert( 
130c0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
130d0 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42  ==0 );.  pOrderB
130e0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
130f0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
13100 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42  rBy );.  nOrderB
13110 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
13120 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f  xpr;..  /* For o
13130 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74  perators other t
13140 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65  han UNION ALL we
13150 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75   have to make su
13160 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  re that.  ** the
13170 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
13180 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65   covers every te
13190 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rm of the result
131a0 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20   set.  Add.  ** 
131b0 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44  terms to the ORD
131c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20  ER BY clause as 
131d0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
131e0 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c    if( op!=TK_ALL
131f0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
13200 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
13210 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45  d==0 && i<=p->pE
13220 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
13230 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
13240 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
13250 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Item;.      for(
13260 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  j=0, pItem=pOrde
13270 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72  rBy->a; j<nOrder
13280 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; j++, pItem++
13290 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
132a0 74 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72  t( pItem->iOrder
132b0 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  ByCol>0 );.     
132c0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 4f     if( pItem->iO
132d0 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62  rderByCol==i ) b
132e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
132f0 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65      if( j==nOrde
13300 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45  rBy ){.        E
13310 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
13320 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
13330 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20  NTEGER, 0);.    
13340 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
13350 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
13360 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
13370 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
13380 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
13390 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
133a0 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  e = i;.        p
133b0 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
133c0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
133d0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
133e0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
133f0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
13400 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64  pOrderBy->a[nOrd
13410 65 72 42 79 2b 2b 5d 2e 69 4f 72 64 65 72 42 79  erBy++].iOrderBy
13420 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
13430 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13440 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
13450 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
13460 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
13470 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
13480 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
13490 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
134a0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
134b0 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
134c0 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
134d0 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
134e0 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
134f0 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
13500 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
13510 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
13520 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
13530 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
13540 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
13550 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
13560 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
13570 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
13580 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
13590 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
135a0 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
135b0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
135c0 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
135d0 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  *nOrderBy);.  if
135e0 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
135f0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
13600 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
13610 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
13620 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
13630 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20  <nOrderBy; i++, 
13640 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
13650 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69  assert( pItem->i
13660 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 20 26 26  OrderByCol>0  &&
13670 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79   pItem->iOrderBy
13680 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Col<=p->pEList->
13690 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
136a0 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74  Permute[i] = pIt
136b0 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 20  em->iOrderByCol 
136c0 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  - 1;.    }.    p
136d0 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20 20 20 20  KeyMerge =.     
136e0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
136f0 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
13700 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72 64 65  pKeyMerge)+nOrde
13710 72 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  rBy*(sizeof(Coll
13720 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20 20 69  Seq*)+1));.    i
13730 66 28 20 70 4b 65 79 4d 65 72 67 65 20 29 7b 0a  f( pKeyMerge ){.
13740 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
13750 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
13760 38 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d 3e 61  8*)&pKeyMerge->a
13770 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  Coll[nOrderBy];.
13780 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
13790 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e  >nField = (u16)n
137a0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
137b0 4b 65 79 4d 65 72 67 65 2d 3e 65 6e 63 20 3d 20  KeyMerge->enc = 
137c0 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66  ENC(db);.      f
137d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
137e0 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
137f0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
13800 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  ;.        Expr *
13810 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79  pTerm = pOrderBy
13820 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
13830 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
13840 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43  >flags & EP_ExpC
13850 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
13860 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 54 65 72      pColl = pTer
13870 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  m->pColl;.      
13880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13890 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
138a0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
138b0 61 72 73 65 2c 20 70 2c 20 61 50 65 72 6d 75 74  arse, p, aPermut
138c0 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  e[i]);.         
138d0 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d   pTerm->flags |=
138e0 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a   EP_ExpCollate;.
138f0 20 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d            pTerm-
13900 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
13910 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13920 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f    pKeyMerge->aCo
13930 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[i] = pColl;. 
13940 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65         pKeyMerge
13950 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
13960 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
13970 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
13980 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
13990 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65  e{.    pKeyMerge
139a0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
139b0 52 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44  Reattach the ORD
139c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  ER BY clause to 
139d0 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
139e0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
139f0 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69  pOrderBy;.  pPri
13a00 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  or->pOrderBy = s
13a10 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
13a20 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f  p(pParse->db, pO
13a30 72 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f  rderBy, 0);..  /
13a40 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e  * Allocate a ran
13a50 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  ge of temporary 
13a60 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
13a70 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64  e KeyInfo needed
13a80 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f  .  ** for the lo
13a90 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73  gic that removes
13aa0 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c   duplicate resul
13ab0 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a  t rows when the.
13ac0 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73    ** operator is
13ad0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
13ae0 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75  or INTERSECT (bu
13af0 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29  t not UNION ALL)
13b00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
13b10 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
13b20 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65  egPrev = 0;.  }e
13b30 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
13b40 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
13b50 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  nExpr;.    asser
13b60 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78  t( nOrderBy>=nEx
13b70 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
13b80 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
13b90 67 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33 47  gPrev = sqlite3G
13ba0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
13bb0 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b 0a 20 20  se, nExpr+1);.  
13bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13bd0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
13be0 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 0, regPrev);.
13bf0 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71      pKeyDup = sq
13c00 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
13c10 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  o(db,.          
13c20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
13c30 70 4b 65 79 44 75 70 29 20 2b 20 6e 45 78 70 72  pKeyDup) + nExpr
13c40 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
13c50 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28  *)+1) );.    if(
13c60 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
13c70 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
13c80 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b  Order = (u8*)&pK
13c90 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78  eyDup->aColl[nEx
13ca0 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 44  pr];.      pKeyD
13cb0 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  up->nField = (u1
13cc0 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 70  6)nExpr;.      p
13cd0 4b 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45 4e  KeyDup->enc = EN
13ce0 43 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72  C(db);.      for
13cf0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
13d00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
13d10 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
13d20 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
13d30 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
13d40 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
13d50 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
13d60 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
13d70 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
13d80 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
13d90 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
13da0 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
13db0 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
13dc0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73  >pPrior = 0;.  s
13dd0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
13de0 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
13df0 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
13e00 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66  , "ORDER");.  if
13e10 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72  ( pPrior->pPrior
13e20 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
13e30 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
13e40 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 50  oupBy(pParse, pP
13e50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f  rior, pPrior->pO
13e60 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
13e70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
13e80 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65  ute the limit re
13e90 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d  gisters */.  com
13ea0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
13eb0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61  rs(pParse, p, la
13ec0 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  belEnd);.  if( p
13ed0 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d  ->iLimit && op==
13ee0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
13ef0 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72  gLimitA = ++pPar
13f00 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
13f10 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72  gLimitB = ++pPar
13f20 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
13f30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13f40 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69  v, OP_Copy, p->i
13f50 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66  Offset ? p->iOff
13f60 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69  set+1 : p->iLimi
13f70 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f90 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b       regLimitA);
13fa0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13fb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
13fc0 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65  y, regLimitA, re
13fd0 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73  gLimitB);.  }els
13fe0 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  e{.    regLimitA
13ff0 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30   = regLimitB = 0
14000 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
14010 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
14020 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70  >pLimit);.  p->p
14030 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c  Limit = 0;.  sql
14040 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
14050 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  b, p->pOffset);.
14060 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
14070 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20  ;..  regAddrA = 
14080 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
14090 20 20 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50    regEofA = ++pP
140a0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
140b0 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73  gAddrB = ++pPars
140c0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f  e->nMem;.  regEo
140d0 66 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  fB = ++pParse->n
140e0 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d  Mem;.  regOutA =
140f0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
14100 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70  .  regOutB = ++p
14110 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
14120 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
14130 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54  Init(&destA, SRT
14140 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
14150 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
14160 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
14170 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75  destB, SRT_Corou
14180 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b  tine, regAddrB);
14190 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74  ..  /* Jump past
141a0 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 75 62   the various sub
141b0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 63 6f 72  routines and cor
141c0 6f 75 74 69 6e 65 73 20 74 6f 20 74 68 65 20 6d  outines to the m
141d0 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c  ain.  ** merge l
141e0 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20  oop.  */.  j1 = 
141f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14200 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
14210 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73   addrSelectA = s
14220 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
14230 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a  tAddr(v);...  /*
14240 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
14250 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
14260 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
14270 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  tement to the.  
14280 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63  ** left of the c
14290 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72  ompound operator
142a0 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63   - the "A" selec
142b0 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  t..  */.  VdbeNo
142c0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  opComment((v, "B
142d0 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66  egin coroutine f
142e0 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29  or left SELECT")
142f0 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69  );.  pPrior->iLi
14300 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b  mit = regLimitA;
14310 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
14320 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
14330 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
14340 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  d);.  sqlite3Sel
14350 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
14360 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73  or, &destA);.  s
14370 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14380 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
14390 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73  1, regEofA);.  s
143a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
143b0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
143c0 67 41 64 64 72 41 29 3b 0a 20 20 56 64 62 65 4e  gAddrA);.  VdbeN
143d0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
143e0 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  End coroutine fo
143f0 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29  r left SELECT"))
14400 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
14410 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
14420 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
14430 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
14440 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74   .  ** the right
14450 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63   - the "B" selec
14460 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  t.  */.  addrSel
14470 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  ectB = sqlite3Vd
14480 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
14490 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
144a0 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63  ent((v, "Begin c
144b0 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
144c0 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ht SELECT"));.  
144d0 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e  savedLimit = p->
144e0 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f  iLimit;.  savedO
144f0 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
14500 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  et;.  p->iLimit 
14510 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70  = regLimitB;.  p
14520 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20  ->iOffset = 0;  
14530 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
14540 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
14550 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
14560 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  d);.  sqlite3Sel
14570 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
14580 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69  destB);.  p->iLi
14590 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74  mit = savedLimit
145a0 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
145b0 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20   savedOffset;.  
145c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
145d0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
145e0 20 31 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20   1, regEofB);.  
145f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14600 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
14610 65 67 41 64 64 72 42 29 3b 0a 20 20 56 64 62 65  egAddrB);.  Vdbe
14620 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
14630 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66  "End coroutine f
14640 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22  or right SELECT"
14650 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ));..  /* Genera
14660 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
14670 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
14680 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
14690 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63  the A.  ** selec
146a0 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
146b0 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
146c0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
146d0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
146e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
146f0 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
14700 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41  A"));.  addrOutA
14710 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
14720 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
14730 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
14740 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20       p, &destA, 
14750 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a  pDest, regOutA,.
14760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14770 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
14780 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  p, P4_KEYINFO_HA
14790 4e 44 4f 46 46 2c 20 6c 61 62 65 6c 45 6e 64 29  NDOFF, labelEnd)
147a0 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ;.  .  /* Genera
147b0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
147c0 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
147d0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
147e0 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63  the B.  ** selec
147f0 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
14800 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
14810 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
14820 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
14830 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
14840 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64  _UNION ){.    Vd
14850 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
14860 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e  , "Output routin
14870 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20  e for B"));.    
14880 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72  addrOutB = gener
14890 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
148a0 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
148c0 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72  &destB, pDest, r
148d0 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20  egOutB,.        
148e0 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
148f0 2c 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45  , pKeyDup, P4_KE
14900 59 49 4e 46 4f 5f 53 54 41 54 49 43 2c 20 6c 61  YINFO_STATIC, la
14910 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20  belEnd);.  }..  
14920 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
14930 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
14940 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
14950 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20   from select A. 
14960 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
14970 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
14980 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61  in select B rema
14990 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ins..  */.  Vdbe
149a0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
149b0 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e  "eof-A subroutin
149c0 65 22 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  e"));.  if( op==
149d0 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
149e0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
149f0 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20  .    addrEofA = 
14a00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14a10 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
14a20 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65   labelEnd);.  }e
14a30 6c 73 65 7b 20 20 0a 20 20 20 20 61 64 64 72 45  lse{  .    addrE
14a40 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
14a50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
14a60 2c 20 72 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c  , regEofB, label
14a70 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  End);.    sqlite
14a80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14a90 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
14aa0 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20  , addrOutB);.   
14ab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14ac0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
14ad0 72 65 67 41 64 64 72 42 29 3b 0a 20 20 20 20 73  regAddrB);.    s
14ae0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14af0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
14b00 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70  addrEofA);.    p
14b10 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20  ->nSelectRow += 
14b20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
14b30 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  ow;.  }..  /* Ge
14b40 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
14b50 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
14b60 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
14b70 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61   select B.  ** a
14b80 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
14b90 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
14ba0 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a  lect A remains..
14bb0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
14bc0 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
14bd0 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64     addrEofB = ad
14be0 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20  drEofA;.    if( 
14bf0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
14c00 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
14c10 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
14c20 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
14c30 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65  lectRow;.  }else
14c40 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
14c50 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
14c60 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
14c70 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  ;.    addrEofB =
14c80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14c90 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
14ca0 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  EofA, labelEnd);
14cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14cc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
14cd0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
14ce0 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  rOutA);.    sqli
14cf0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14d00 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
14d10 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  drA);.    sqlite
14d20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14d30 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
14d40 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ofB);.  }..  /* 
14d50 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
14d60 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
14d70 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56   of A<B.  */.  V
14d80 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
14d90 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f  v, "A-lt-B subro
14da0 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
14db0 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AltB = sqlite3Vd
14dc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
14dd0 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
14de0 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69  ddrOutA);.  sqli
14df0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14e00 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
14e10 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  drA);.  sqlite3V
14e20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14e30 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64  If, regEofA, add
14e40 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65  rEofA);.  sqlite
14e50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14e60 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
14e70 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Cmpr);..  /* Gen
14e80 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
14e90 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
14ea0 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28   A==B.  */.  if(
14eb0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
14ec0 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
14ed0 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20  drAltB;.  }else 
14ee0 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
14ef0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
14f00 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
14f10 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b  .    addrAltB++;
14f20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
14f30 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
14f40 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75  , "A-eq-B subrou
14f50 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
14f60 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69  rAeqB =.    sqli
14f70 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14f80 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
14f90 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  drA);.    sqlite
14fa0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14fb0 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61  P_If, regEofA, a
14fc0 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 73 71  ddrEofA);.    sq
14fd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14fe0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
14ff0 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a  abelCmpr);.  }..
15000 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
15010 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
15020 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a   case of A>B.  *
15030 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
15040 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20  ent((v, "A-gt-B 
15050 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
15060 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69   addrAgtB = sqli
15070 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
15080 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d  dr(v);.  if( op=
15090 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
150a0 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73  K_UNION ){.    s
150b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
150c0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
150d0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
150e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
150f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
15100 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29  Yield, regAddrB)
15110 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15120 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
15130 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66  regEofB, addrEof
15140 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
15150 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
15160 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
15170 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
15180 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  de runs once to 
15190 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79  initialize every
151a0 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71  thing..  */.  sq
151b0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
151c0 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69  e(v, j1);.  sqli
151d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
151e0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
151f0 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  regEofA);.  sqli
15200 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15210 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
15220 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69  regEofB);.  sqli
15230 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15240 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64   OP_Gosub, regAd
15250 64 72 41 2c 20 61 64 64 72 53 65 6c 65 63 74 41  drA, addrSelectA
15260 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15270 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
15280 75 62 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ub, regAddrB, ad
15290 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 73 71  drSelectB);.  sq
152a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
152b0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
152c0 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  A, addrEofA);.  
152d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
152e0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
152f0 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  ofB, addrEofB);.
15300 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  .  /* Implement 
15310 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c  the main merge l
15320 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
15330 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
15340 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  el(v, labelCmpr)
15350 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15360 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d  ddOp4(v, OP_Perm
15370 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  utation, 0, 0, 0
15380 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74  , (char*)aPermut
15390 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  e, P4_INTARRAY);
153a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
153b0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
153c0 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c  re, destA.iSdst,
153d0 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f   destB.iSdst, nO
153e0 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67   (char*)pKeyMerg
15410 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  e, P4_KEYINFO_HA
15420 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65  NDOFF);.  sqlite
15430 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
15440 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42  P_Jump, addrAltB
15450 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72  , addrAeqB, addr
15460 41 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c  AgtB);..  /* Rel
15470 65 61 73 65 20 74 65 6d 70 6f 72 61 72 79 20 72  ease temporary r
15480 65 67 69 73 74 65 72 73 0a 20 20 2a 2f 0a 20 20  egisters.  */.  
15490 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20  if( regPrev ){. 
154a0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
154b0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
154c0 65 2c 20 72 65 67 50 72 65 76 2c 20 6e 4f 72 64  e, regPrev, nOrd
154d0 65 72 42 79 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20  erBy+1);.  }..  
154e0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74  /* Jump to the t
154f0 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64  his point in ord
15500 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  er to terminate 
15510 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
15520 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
15530 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
15540 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65  elEnd);..  /* Se
15550 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
15560 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20  output columns. 
15570 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
15580 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
15590 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ut ){.    Select
155a0 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f   *pFirst = pPrio
155b0 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46  r;.    while( pF
155c0 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
155d0 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
155e0 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65  pPrior;.    gene
155f0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
15600 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
15610 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  t->pEList);.  }.
15620 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79  .  /* Reassembly
15630 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
15640 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77  ery so that it w
15650 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72  ill be freed cor
15660 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74  rectly.  ** by t
15670 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
15680 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ion */.  if( p->
15690 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71  pPrior ){.    sq
156a0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
156b0 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29  e(db, p->pPrior)
156c0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f  ;.  }.  p->pPrio
156d0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20 20 2f  r = pPrior;..  /
156e0 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74  *** TBD:  Insert
156f0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
15700 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f  s to close curso
15710 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65  rs on incomplete
15720 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69  .  **** subqueri
15730 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61  es ****/.  expla
15740 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
15750 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
15760 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72  , iSub2, 0);.  r
15770 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15780 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
15790 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
157a0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
157b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
157c0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46  _OMIT_VIEW)./* F
157d0 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69  orward Declarati
157e0 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ons */.static vo
157f0 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
15800 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c  (sqlite3*, ExprL
15810 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ist*, int, ExprL
15820 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
15830 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73  id substSelect(s
15840 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20  qlite3*, Select 
15850 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
15860 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e   *);../*.** Scan
15870 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
15880 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
15890 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
158a0 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
158b0 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
158c0 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
158d0 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
158e0 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
158f0 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
15900 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
15910 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
15920 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
15930 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
15940 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
15950 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
15960 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
15970 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
15980 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
15990 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
159a0 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
159b0 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
159c0 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
159d0 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
159e0 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
159f0 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
15a00 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
15a10 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
15a20 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
15a30 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63  ine make the nec
15a40 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
15a50 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
15a60 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
15a70 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
15a80 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
15a90 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
15aa0 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
15ab0 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
15ac0 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ery..*/.static E
15ad0 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a  xpr *substExpr(.
15ae0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
15af0 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
15b00 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f  malloc errors to
15b10 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
15b20 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
15b30 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70  r,        /* Exp
15b40 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74  r in which subst
15b50 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a  itution occurs *
15b60 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
15b70 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
15b80 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74   to be substitut
15b90 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
15ba0 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53   *pEList    /* S
15bb0 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65 73  ubstitute expres
15bc0 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  sions */.){.  if
15bd0 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
15be0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
15bf0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
15c00 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
15c10 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20  le==iTable ){.  
15c20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
15c30 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
15c40 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
15c50 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
15c60 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
15c70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15c80 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
15c90 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69  pr->iColumn<pELi
15ca0 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
15cb0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
15cc0 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
15cd0 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
15ce0 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
15cf0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
15d00 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  , pEList->a[pExp
15d10 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
15d20 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 0);.      if(
15d30 20 70 4e 65 77 20 26 26 20 70 45 78 70 72 2d 3e   pNew && pExpr->
15d40 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
15d50 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c 20 3d 20 70   pNew->pColl = p
15d60 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Expr->pColl;.   
15d70 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
15d80 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
15d90 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70   pExpr);.      p
15da0 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Expr = pNew;.   
15db0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
15dc0 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
15dd0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78  ubstExpr(db, pEx
15de0 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  pr->pLeft, iTabl
15df0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
15e00 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
15e10 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45  substExpr(db, pE
15e20 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  xpr->pRight, iTa
15e30 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
15e40 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
15e50 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
15e60 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
15e70 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
15e80 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  db, pExpr->x.pSe
15e90 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
15ea0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  List);.    }else
15eb0 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
15ec0 72 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d  rList(db, pExpr-
15ed0 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65  >x.pList, iTable
15ee0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
15ef0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
15f00 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  xpr;.}.static vo
15f10 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
15f20 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
15f30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
15f40 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
15f50 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c   here */.  ExprL
15f60 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
15f70 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20  /* List to scan 
15f80 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20  and in which to 
15f90 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73  make substitutes
15fa0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
15fb0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
15fc0 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
15fd0 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
15fe0 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
15ff0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
16000 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lues */.){.  int
16010 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
16020 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
16030 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
16040 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
16050 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
16060 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28  xpr = substExpr(
16070 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
16080 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70  pExpr, iTable, p
16090 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
160a0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
160b0 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  elect(.  sqlite3
160c0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
160d0 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
160e0 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20  rrors here */.  
160f0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
16100 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
16110 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
16120 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
16130 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
16140 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
16150 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
16160 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45   replaced */.  E
16170 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
16180 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
16190 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
161a0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
161b0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
161c0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
161d0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20  int i;.  if( !p 
161e0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73  ) return;.  subs
161f0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
16200 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  >pEList, iTable,
16210 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
16220 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
16230 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c  >pGroupBy, iTabl
16240 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
16250 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
16260 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61  p->pOrderBy, iTa
16270 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
16280 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  p->pHaving = sub
16290 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48  stExpr(db, p->pH
162a0 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70  aving, iTable, p
162b0 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 57 68  EList);.  p->pWh
162c0 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28  ere = substExpr(
162d0 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69  db, p->pWhere, i
162e0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
162f0 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
16300 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61  , p->pPrior, iTa
16310 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
16320 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
16330 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
16340 3b 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72 20 28  ;  /* Even for (
16350 53 45 4c 45 43 54 20 31 29 20 77 65 20 68 61 76  SELECT 1) we hav
16360 65 3a 20 70 53 72 63 21 3d 30 20 62 75 74 20 70  e: pSrc!=0 but p
16370 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a  Src->nSrc==0 */.
16380 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72    if( ALWAYS(pSr
16390 63 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  c) ){.    for(i=
163a0 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65  pSrc->nSrc, pIte
163b0 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20  m=pSrc->a; i>0; 
163c0 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
163d0 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
163e0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  (db, pItem->pSel
163f0 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ect, iTable, pEL
16400 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
16410 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
16420 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16430 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
16440 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16450 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
16460 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
16470 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
16480 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
16490 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
164a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
164b0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
164c0 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
164d0 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  as a performance
164e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
164f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
16500 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
16510 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
16520 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
16530 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ing occurs..**.*
16540 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
16550 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
16560 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
16570 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
16580 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
16590 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
165a0 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
165b0 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
165c0 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
165d0 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
165e0 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
165f0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
16600 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
16610 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
16620 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
16630 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
16640 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
16650 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
16660 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
16670 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
16680 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
16690 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
166a0 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
166b0 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
166c0 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
166d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
166e0 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
166f0 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
16700 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
16710 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
16720 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
16730 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16740 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
16750 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
16760 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
16770 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
16780 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
16790 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
167a0 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
167b0 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
167c0 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
167d0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
167e0 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
167f0 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67   simpification g
16800 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65  ives the same re
16810 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79  sult.** but only
16820 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65   has to scan the
16830 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64   data once.  And
16840 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73   because indices
16850 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74   might .** exist
16860 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31   on the table t1
16870 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61  , a complete sca
16880 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69  n of the data mi
16890 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65  ght be.** avoide
168a0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e  d..**.** Flatten
168b0 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65  ing is only atte
168c0 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20  mpted if all of 
168d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
168e0 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
168f0 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (1)  The subquer
16900 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
16910 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
16920 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  h use aggregates
16930 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54  ..**.**   (2)  T
16940 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
16950 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
16960 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
16970 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
16980 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54  ..**.**   (3)  T
16990 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
169a0 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  ot the right ope
169b0 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
169c0 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20  uter join.**    
169d0 20 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20      (Originally 
169e0 74 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74  ticket #306.  St
169f0 72 65 6e 67 74 68 65 6e 65 64 20 62 79 20 74 69  rengthened by ti
16a00 63 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a  cket #3300).**.*
16a10 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62  *   (4)  The sub
16a20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53  query is not DIS
16a30 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  TINCT..**.**  (*
16a40 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74  *)  At one point
16a50 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34   restrictions (4
16a60 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65  ) and (5) define
16a70 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49  d a subset of DI
16a80 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20  STINCT.**       
16a90 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61   sub-queries tha
16aa0 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20  t were excluded 
16ab0 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69  from this optimi
16ac0 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74  zation. Restrict
16ad0 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28  ion .**        (
16ae0 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65  4) has since bee
16af0 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78  n expanded to ex
16b00 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e  clude all DISTIN
16b10 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  CT subqueries..*
16b20 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20  *.**   (6)  The 
16b30 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
16b40 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
16b50 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
16b60 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
16b70 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a       DISTINCT..*
16b80 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20  *.**   (7)  The 
16b90 73 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46  subquery has a F
16ba0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44  ROM clause.  TOD
16bb0 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69  O:  For subqueri
16bc0 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20  es without.**   
16bd0 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75       A FROM clau
16be0 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64  se, consider add
16bf0 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65  ing a FROM close
16c00 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
16c10 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c  l.**        tabl
16c20 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68  e sqlite_once th
16c30 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  at consists of a
16c40 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74   single row cont
16c50 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  aining a.**     
16c60 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a     single NULL..
16c70 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65  **.**   (8)  The
16c80 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
16c90 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
16ca0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
16cb0 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
16cc0 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20  *.**   (9)  The 
16cd0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
16ce0 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
16cf0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
16d00 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
16d10 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
16d20 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54  ..**.**  (10)  T
16d30 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
16d40 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
16d50 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
16d60 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a   query does not.
16d70 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49  **        use LI
16d80 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  MIT..**.**  (11)
16d90 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
16da0 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
16db0 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68  ry do not both h
16dc0 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  ave ORDER BY cla
16dd0 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  uses..**.**  (**
16de0 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74  )  Not implement
16df0 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e  ed.  Subsumed in
16e00 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  to restriction (
16e10 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75  3).  Was previou
16e20 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20  sly.**        a 
16e30 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63  separate restric
16e40 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72  tion deriving fr
16e50 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a  om ticket #350..
16e60 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65  **.**  (13)  The
16e70 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75   subquery and ou
16e80 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
16e90 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e   both use LIMIT.
16ea0 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68  .**.**  (14)  Th
16eb0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
16ec0 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a  not use OFFSET..
16ed0 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65  **.**  (15)  The
16ee0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
16ef0 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  not part of a co
16f00 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72  mpound select or
16f10 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
16f20 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
16f30 20 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c   have a LIMIT cl
16f40 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ause..**        
16f50 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33  (See ticket #233
16f60 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32  9 and ticket [02
16f70 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a  a8e81d44])..**.*
16f80 2a 20 20 28 31 36 29 20 20 54 68 65 20 6f 75 74  *  (16)  The out
16f90 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
16fa0 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
16fb0 74 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  the subquery doe
16fc0 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20  s.**        not 
16fd0 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
16fe0 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32  .  (Ticket #2942
16ff0 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20  )  This used to 
17000 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20  not matter.**   
17010 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e       until we in
17020 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f  troduced the gro
17030 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63  up_concat() func
17040 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28  tion.  .**.**  (
17050 31 37 29 20 20 54 68 65 20 73 75 62 2d 71 75 65  17)  The sub-que
17060 72 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70  ry is not a comp
17070 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20  ound select, or 
17080 69 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c  it is a UNION AL
17090 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d  L .**        com
170a0 70 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64  pound clause mad
170b0 65 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66  e up entirely of
170c0 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71   non-aggregate q
170d0 75 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20  ueries, and .** 
170e0 20 20 20 20 20 20 20 74 68 65 20 70 61 72 65 6e         the paren
170f0 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  t query:.**.**  
17100 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
17110 20 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20   itself part of 
17120 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
17130 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  t,.**          *
17140 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
17150 67 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54  gate or DISTINCT
17160 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20   query, and.**  
17170 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
17180 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20   a join.**.**   
17190 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74 20       The parent 
171a0 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61  and sub-query ma
171b0 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20  y contain WHERE 
171c0 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74  clauses. Subject
171d0 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75   to.**        ru
171e0 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29 20 61  les (11), (13) a
171f0 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61  nd (14), they ma
17200 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f  y also contain O
17210 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20  RDER BY,.**     
17220 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46     LIMIT and OFF
17230 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68  SET clauses.  Th
17240 65 20 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f  e subquery canno
17250 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75  t use any compou
17260 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
17270 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e  rator other than
17280 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75   UNION ALL becau
17290 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  se all the other
172a0 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
172b0 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61      operators ha
172c0 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49  ve an implied DI
172d0 53 54 49 4e 43 54 20 77 68 69 63 68 20 69 73 20  STINCT which is 
172e0 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a  disallowed by.**
172f0 20 20 20 20 20 20 20 20 72 65 73 74 72 69 63 74          restrict
17300 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20  ion (4)..**.**  
17310 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68        Also, each
17320 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68   component of th
17330 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74  e sub-query must
17340 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
17350 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20   number.**      
17360 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75    of result colu
17370 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61 63 74  mns. This is act
17380 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d  ually a requirem
17390 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70  ent for any comp
173a0 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53  ound.**        S
173b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
173c0 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64   but all the cod
173d0 65 20 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d  e here does is m
173e0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f  ake sure that no
173f0 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63 68 20  .**        such 
17400 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75  (illegal) sub-qu
17410 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64  ery is flattened
17420 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
17430 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20  l detect the.** 
17440 20 20 20 20 20 20 20 73 79 6e 74 61 78 20 65 72         syntax er
17450 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ror and return a
17460 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67   detailed messag
17470 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20  e..**.**  (18)  
17480 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
17490 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
174a0 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20  elect, then all 
174b0 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20  terms of the.** 
174c0 20 20 20 20 20 20 20 4f 52 44 45 52 20 62 79 20         ORDER by 
174d0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70 61  clause of the pa
174e0 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d  rent must be sim
174f0 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ple references t
17500 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c  o .**        col
17510 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d  umns of the sub-
17520 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  query..**.**  (1
17530 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
17540 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
17550 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
17560 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a   query does not.
17570 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61  **        have a
17580 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
17590 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74  *.**  (20)  If t
175a0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
175b0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
175c0 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  t, then it must 
175d0 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
175e0 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c    an ORDER BY cl
175f0 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33  ause.  Ticket #3
17600 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72  773.  We could r
17610 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72  elax this constr
17620 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73  aint.**        s
17630 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e  omewhat by sayin
17640 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73  g that the terms
17650 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
17660 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20   clause must.** 
17670 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73         appear as
17680 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75   unmodified resu
17690 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  lt columns in th
176a0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
176b0 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20  But we.**       
176c0 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69   have other opti
176d0 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e  mizations in min
176e0 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  d to deal with t
176f0 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  hat case..**.** 
17700 20 28 32 31 29 20 20 54 68 65 20 73 75 62 71 75   (21)  The subqu
17710 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
17720 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
17730 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
17740 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
17750 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65  NCT.  (See ticke
17760 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e  t [752e1646fc]).
17770 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
17780 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
17790 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
177a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
177b0 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
177c0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
177d0 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
177e0 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
177f0 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
17800 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
17810 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65  gates and subque
17820 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20  ryIsAgg is true 
17830 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
17840 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
17850 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
17860 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
17870 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
17880 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
17890 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
178a0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
178b0 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
178c0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
178d0 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
178e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
178f0 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
17900 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
17910 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
17920 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
17930 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
17940 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
17950 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
17960 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
17970 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
17980 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
17990 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
179a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
179b0 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
179c0 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
179d0 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
179e0 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
179f0 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
17a00 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
17a10 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
17a20 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20  .  int isAgg,   
17a30 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
17a40 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
17a50 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
17a60 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
17a70 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  t subqueryIsAgg 
17a80 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
17a90 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
17aa0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
17ab0 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ons */.){.  cons
17ac0 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
17ad0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
17ae0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
17af0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72  ;.  Select *pPar
17b00 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ent;.  Select *p
17b10 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
17b20 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
17b30 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
17b40 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20   Select *pSub1; 
17b50 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
17b60 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  to the rightmost
17b70 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71   select in sub-q
17b80 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
17b90 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
17ba0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
17bb0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
17bc0 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
17bd0 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
17be0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
17bf0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
17c00 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
17c10 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
17c20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
17c30 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
17c40 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
17c50 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
17c60 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
17c70 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
17c80 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
17c90 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
17ca0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
17cb0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
17cc0 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
17cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17ce0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
17cf0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
17d00 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
17d10 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
17d20 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  ubquery */.  sql
17d30 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
17d40 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65  e->db;..  /* Che
17d50 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
17d60 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
17d70 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
17d80 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61  if not..  */.  a
17d90 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
17da0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
17db0 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61  or==0 );  /* Una
17dc0 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63  ble to flatten c
17dd0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20  ompound queries 
17de0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  */.  if( db->fla
17df0 67 73 20 26 20 53 51 4c 49 54 45 5f 51 75 65 72  gs & SQLITE_Quer
17e00 79 46 6c 61 74 74 65 6e 65 72 20 29 20 72 65 74  yFlattener ) ret
17e10 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
17e20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
17e30 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
17e40 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
17e50 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
17e60 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
17e70 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65  [iFrom];.  iPare
17e80 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
17e90 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d  Cursor;.  pSub =
17ea0 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
17eb0 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
17ec0 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  ub!=0 );.  if( i
17ed0 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79  sAgg && subquery
17ee0 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
17ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17f00 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
17f10 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73   (1)  */.  if( s
17f20 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20  ubqueryIsAgg && 
17f30 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
17f40 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
17f50 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
17f60 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53   (2)  */.  pSubS
17f70 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
17f80 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
17f90 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72  rc );.  /* Prior
17fa0 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e   to version 3.1.
17fb0 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  2, when LIMIT an
17fc0 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20  d OFFSET had to 
17fd0 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61  be simple consta
17fe0 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72  nts,.  ** not ar
17ff0 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73  bitrary expresss
18000 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
18010 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
18020 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
18030 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
18040 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
18050 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
18060 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
18070 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
18080 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
18090 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
180a0 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
180b0 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
180c0 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
180d0 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
180e0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
180f0 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
18100 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
18110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
18120 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
18130 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
18140 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
18170 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
18180 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74  .  if( p->pRight
18190 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c  most && pSub->pL
181a0 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75  imit ){.    retu
181b0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
181c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181e0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
181f0 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (15) */.  }.  if
18200 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d  ( pSubSrc->nSrc=
18210 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18230 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
18240 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66  ion (7)  */.  if
18250 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
18260 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
18270 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
18280 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
18290 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66  ion (5)  */.  if
182a0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
182b0 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  & (pSrc->nSrc>1 
182c0 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  || isAgg) ){.   
182d0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
182e0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
182f0 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20  ons (8)(9) */.  
18300 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  }.  if( (p->selF
18310 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
18320 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65  ct)!=0 && subque
18330 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ryIsAgg ){.     
18340 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
18350 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
18360 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69   (6)  */.  }.  i
18370 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26  f( p->pOrderBy &
18380 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
18390 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
183a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
183b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
183d0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29  Restriction (11)
183e0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   */.  }.  if( is
183f0 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  Agg && pSub->pOr
18400 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30  derBy ) return 0
18410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18420 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
18430 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (16) */.  if( pS
18440 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
18450 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
18460 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18470 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
18480 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (19) */.  if( pS
18490 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
184a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
184b0 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a  Distinct)!=0 ){.
184c0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
184d0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
184e0 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20  ction (21) */.  
184f0 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45  }..  /* OBSOLETE
18500 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a   COMMENT 1:.  **
18510 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20   Restriction 3: 
18520 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
18530 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65   is a join, make
18540 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
18550 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  ry is .  ** not 
18560 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68  used as the righ
18570 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20  t operand of an 
18580 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61  outer join.  Exa
18590 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
185a0 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c  s.  ** is not al
185b0 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
185c0 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
185d0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20   OUTER JOIN (t2 
185e0 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20  JOIN t3).  **.  
185f0 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e  ** If we flatten
18600 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77   the above, we w
18610 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20  ould get.  **.  
18620 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c  **         (t1 L
18630 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74  EFT OUTER JOIN t
18640 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a  2) JOIN t3.  **.
18650 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f    ** which is no
18660 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d  t at all the sam
18670 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20  e thing..  **.  
18680 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d  ** OBSOLETE COMM
18690 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74  ENT 2:.  ** Rest
186a0 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20  riction 12:  If 
186b0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
186c0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
186d0 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
186e0 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b  r.  ** join, mak
186f0 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
18700 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45  ery has no WHERE
18710 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e   clause..  ** An
18720 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79   examples of why
18730 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c   this is not all
18740 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
18750 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
18760 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45  OUTER JOIN (SELE
18770 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45  CT * FROM t2 WHE
18780 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a  RE t2.x>0).  **.
18790 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
187a0 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
187b0 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
187c0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
187d0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
187e0 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e   t2) WHERE t2.x>
187f0 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20  0.  **.  ** But 
18800 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20  the t2.x>0 test 
18810 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c  will always fail
18820 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f   on a NULL row o
18830 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a  f t2, which.  **
18840 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e   effectively con
18850 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20  verts the OUTER 
18860 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e  JOIN into an INN
18870 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20  ER JOIN..  **.  
18880 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44 45  ** THIS OVERRIDE
18890 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  S OBSOLETE COMME
188a0 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56  NTS 1 AND 2 ABOV
188b0 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  E:.  ** Ticket #
188c0 33 33 30 30 20 73 68 6f 77 73 20 74 68 61 74 20  3300 shows that 
188d0 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72  flattening the r
188e0 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
188f0 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73  EFT JOIN.  ** is
18900 20 66 72 61 75 67 68 74 20 77 69 74 68 20 64 61   fraught with da
18910 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61  nger.  Best to a
18920 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74  void the whole t
18930 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20  hing.  If the.  
18940 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 74  ** subquery is t
18950 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
18960 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68   a LEFT JOIN, th
18970 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65  en do not flatte
18980 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  n..  */.  if( (p
18990 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  Subitem->jointyp
189a0 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
189b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
189c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74  ;.  }..  /* Rest
189d0 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74  riction 17: If t
189e0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
189f0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
18a00 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a  T, then it must.
18a10 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68    ** use only th
18a20 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
18a30 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f  ator. And none o
18a40 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c  f the simple sel
18a50 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a  ect queries.  **
18a60 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
18a70 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
18a80 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  T are allowed to
18a90 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72   be aggregate or
18aa0 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71   distinct.  ** q
18ab0 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  ueries..  */.  i
18ac0 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20  f( pSub->pPrior 
18ad0 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ){.    if( pSub-
18ae0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
18af0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
18b00 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30 20   Restriction 20 
18b10 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
18b20 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65   isAgg || (p->se
18b30 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
18b40 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63  inct)!=0 || pSrc
18b50 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20  ->nSrc!=1 ){.   
18b60 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
18b70 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31   }.    for(pSub1
18b80 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53  =pSub; pSub1; pS
18b90 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f  ub1=pSub1->pPrio
18ba0 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  r){.      testca
18bb0 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
18bc0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
18bd0 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
18be0 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
18bf0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
18c00 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
18c10 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
18c20 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
18c30 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20  )==SF_Aggregate 
18c40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18c50 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29   pSub->pSrc!=0 )
18c60 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75  ;.      if( (pSu
18c70 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
18c80 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
18c90 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20  ggregate))!=0.  
18ca0 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e       || (pSub1->
18cb0 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d  pPrior && pSub1-
18cc0 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20  >op!=TK_ALL) .  
18cd0 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70       || pSub1->p
18ce0 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20  Src->nSrc<1.    
18cf0 20 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45 4c 69     || pSub->pELi
18d00 73 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75 62 31  st->nExpr!=pSub1
18d10 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a  ->pEList->nExpr.
18d20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
18d30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
18d40 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
18d50 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e  e( pSub1->pSrc->
18d60 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a  nSrc>1 );.    }.
18d70 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74  .    /* Restrict
18d80 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69  ion 18. */.    i
18d90 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
18da0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a  {.      int ii;.
18db0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
18dc0 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  ii<p->pOrderBy->
18dd0 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
18de0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
18df0 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 69 4f 72  derBy->a[ii].iOr
18e00 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65  derByCol==0 ) re
18e10 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
18e20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a      }.  }..  /**
18e30 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
18e40 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
18e50 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
18e60 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f  ted. *****/..  /
18e70 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20  * Authorize the 
18e80 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50  subquery */.  pP
18e90 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
18ea0 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a  xt = pSubitem->z
18eb0 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  Name;.  TESTONLY
18ec0 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74  (i =) sqlite3Aut
18ed0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
18ee0 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
18ef0 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61   0, 0);.  testca
18f00 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45  se( i==SQLITE_DE
18f10 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  NY );.  pParse->
18f20 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
18f30 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
18f40 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
18f50 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
18f60 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
18f70 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62  atement, then (b
18f80 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20  y restrictions. 
18f90 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62   ** 17 and 18 ab
18fa0 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20  ove) it must be 
18fb0 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20  a UNION ALL and 
18fc0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
18fd0 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f   must .  ** be o
18fe0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
18ff0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
19000 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f   <expr-list> FRO
19010 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20  M (<sub-query>) 
19020 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a  <where-clause> .
19030 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77    **.  ** follow
19040 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20  ed by any ORDER 
19050 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72  BY, LIMIT and/or
19060 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
19070 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a   This block.  **
19080 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70   creates N-1 cop
19090 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ies of the paren
190a0 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20  t query without 
190b0 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
190c0 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46  MIT or .  ** OFF
190d0 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20  SET clauses and 
190e0 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68  joins them to th
190f0 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65  e left-hand-side
19100 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
19110 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f  .  ** using UNIO
19120 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e  N ALL operators.
19130 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20   In this case N 
19140 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
19150 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c   simple.  ** sel
19160 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ect statements i
19170 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  n the compound s
19180 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  ub-query..  **. 
19190 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
191a0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
191b0 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a  T a+1 FROM (.  *
191c0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
191d0 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  x FROM tab.  ** 
191e0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
191f0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
19200 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20  ECT y FROM tab. 
19210 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
19220 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
19230 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
19240 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20   FROM tab2.  ** 
19250 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35      ) WHERE a!=5
19260 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
19270 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  .  ** Transforme
19280 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
19290 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31  *     SELECT x+1
192a0 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
192b0 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  x+1!=5.  **     
192c0 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
192d0 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52     SELECT y+1 FR
192e0 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31  OM tab WHERE y+1
192f0 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
19300 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
19310 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b  SELECT abs(z*2)+
19320 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52  1 FROM tab2 WHER
19330 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a  E abs(z*2)+1!=5.
19340 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42    **     ORDER B
19350 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  Y 1.  **.  ** We
19360 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22   call this the "
19370 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
19380 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20  y flattening".. 
19390 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70   */.  for(pSub=p
193a0 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75  Sub->pPrior; pSu
193b0 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  b; pSub=pSub->pP
193c0 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63  rior){.    Selec
193d0 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70  t *pNew;.    Exp
193e0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
193f0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
19400 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20     Expr *pLimit 
19410 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
19420 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20   Select *pPrior 
19430 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
19440 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
19450 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
19460 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  0;.    p->pPrior
19470 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69   = 0;.    p->pLi
19480 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  mit = 0;.    pNe
19490 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  w = sqlite3Selec
194a0 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a  tDup(db, p, 0);.
194b0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
194c0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70  pLimit;.    p->p
194d0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
194e0 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20  By;.    p->pSrc 
194f0 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f  = pSrc;.    p->o
19500 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20  p = TK_ALL;.    
19510 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  p->pRightmost = 
19520 30 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  0;.    if( pNew=
19530 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  =0 ){.      pNew
19540 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d   = pPrior;.    }
19550 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77  else{.      pNew
19560 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
19570 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  r;.      pNew->p
19580 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20  Rightmost = 0;. 
19590 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72 69     }.    p->pPri
195a0 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69  or = pNew;.    i
195b0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
195c0 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  led ) return 1;.
195d0 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
195e0 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69  flattening the i
195f0 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66  From-th entry of
19600 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19610 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75   .  ** in the ou
19620 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  ter query..  */.
19630 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d    pSub = pSub1 =
19640 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
19650 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  ct;..  /* Delete
19660 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74   the transient t
19670 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  able structure a
19680 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
19690 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
196a0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
196b0 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
196c0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
196d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
196e0 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  db, pSubitem->zN
196f0 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
19700 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74  bFree(db, pSubit
19710 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70  em->zAlias);.  p
19720 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
19730 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  se = 0;.  pSubit
19740 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  em->zName = 0;. 
19750 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
19760 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  s = 0;.  pSubite
19770 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  m->pSelect = 0;.
19780 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65  .  /* Defer dele
19790 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f  ting the Table o
197a0 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
197b0 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
197c0 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f  ubquery until co
197d0 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73  de generation is
197e0 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20  .  ** complete, 
197f0 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20  since there may 
19800 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72  still exist Expr
19810 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68  .pTab entries th
19820 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f  at.  ** refer to
19830 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76   the subquery ev
19840 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e  en after flatten
19850 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33  ing.  Ticket #33
19860 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53  46..  **.  ** pS
19870 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20  ubitem->pTab is 
19880 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  always non-NULL 
19890 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74  by test restrict
198a0 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61  ions and tests a
198b0 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bove..  */.  if(
198c0 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d   ALWAYS(pSubitem
198d0 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20  ->pTab!=0) ){.  
198e0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44    Table *pTabToD
198f0 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  el = pSubitem->p
19900 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61  Tab;.    if( pTa
19910 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20  bToDel->nRef==1 
19920 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a  ){.      Parse *
19930 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
19940 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
19950 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19960 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74  pTabToDel->pNext
19970 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76  Zombie = pToplev
19980 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a  el->pZombieTab;.
19990 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
199a0 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54  >pZombieTab = pT
199b0 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c  abToDel;.    }el
199c0 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  se{.      pTabTo
199d0 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  Del->nRef--;.   
199e0 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d   }.    pSubitem-
199f0 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a  >pTab = 0;.  }..
19a00 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
19a10 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63  ng loop runs onc
19a20 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20  e for each term 
19a30 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  in a compound-su
19a40 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74  bquery.  ** flat
19a50 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72  tening (as descr
19a60 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66  ibed above).  If
19a70 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
19a80 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20  different kind. 
19a90 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e   ** of flattenin
19aa0 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67  g - a flattening
19ab0 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f   other than a co
19ac0 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
19ad0 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a  flattening -.  *
19ae0 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70  * then this loop
19af0 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e   only runs once.
19b00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
19b10 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f  loop moves all o
19b20 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65  f the FROM eleme
19b30 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75  nts of the subqu
19b40 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ery into the.  *
19b50 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
19b60 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
19b70 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f  uery.  Before do
19b80 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62  ing this, rememb
19b90 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  er.  ** the curs
19ba0 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
19bb0 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
19bc0 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
19bd0 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72  ent in.  ** iPar
19be0 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e  ent.  The iParen
19bf0 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65  t cursor will ne
19c00 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75  ver be used.  Su
19c10 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20  bsequent code.  
19c20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70  ** will scan exp
19c30 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67  ressions looking
19c40 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66   for iParent ref
19c50 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c  erences and repl
19c60 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72  ace.  ** those r
19c70 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
19c80 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
19c90 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
19ca0 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a  ubquery FROM.  *
19cb0 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72  * elements we ar
19cc0 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e  e now copying in
19cd0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61  ..  */.  for(pPa
19ce0 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b  rent=p; pParent;
19cf0 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74   pParent=pParent
19d00 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70  ->pPrior, pSub=p
19d10 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
19d20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20    int nSubSrc;. 
19d30 20 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d     u8 jointype =
19d40 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20   0;.    pSubSrc 
19d50 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20  = pSub->pSrc;   
19d60 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
19d70 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a   of subquery */.
19d80 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53      nSubSrc = pS
19d90 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a  ubSrc->nSrc;  /*
19da0 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
19db0 20 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f   in subquery FRO
19dc0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
19dd0 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
19de0 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
19df0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
19e00 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a  outer query */..
19e10 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a      if( pSrc ){.
19e20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
19e30 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20  arent==p );  /* 
19e40 46 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75  First time throu
19e50 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  gh the loop */. 
19e60 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20       jointype = 
19e70 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
19e80 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pe;.    }else{. 
19e90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
19ea0 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32  rent!=p );  /* 2
19eb0 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
19ec0 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20  t times through 
19ed0 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  the loop */.    
19ee0 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
19ef0 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
19f00 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
19f10 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
19f20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b    if( pSrc==0 ){
19f30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
19f40 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19f50 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d );.        bre
19f60 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
19f70 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75  }..    /* The su
19f80 62 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69  bquery uses a si
19f90 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65  ngle slot of the
19fa0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
19fb0 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a  the outer.    **
19fc0 20 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20   query.  If the 
19fd0 73 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72  subquery has mor
19fe0 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65  e than one eleme
19ff0 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  nt in its FROM c
1a000 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68  lause,.    ** th
1a010 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  en expand the ou
1a020 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b  ter query to mak
1a030 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74  e space for it t
1a040 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65  o hold all eleme
1a050 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nts.    ** of th
1a060 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
1a070 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
1a080 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
1a090 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1a0a0 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20  M tabA, (SELECT 
1a0b0 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62  * FROM sub1, sub
1a0c0 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a  2), tabB;.    **
1a0d0 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65  .    ** The oute
1a0e0 72 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c  r query has 3 sl
1a0f0 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ots in its FROM 
1a100 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f  clause.  One slo
1a110 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
1a120 6f 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65  outer query (the
1a130 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73   middle slot) is
1a140 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62   used by the sub
1a150 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74  query.  The next
1a160 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66  .    ** block of
1a170 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e   code will expan
1a180 64 20 74 68 65 20 6f 75 74 20 71 75 65 72 79 20  d the out query 
1a190 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65  to 4 slots.  The
1a1a0 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73   middle.    ** s
1a1b0 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20  lot is expanded 
1a1c0 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20  to two slots in 
1a1d0 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70  order to make sp
1a1e0 61 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20  ace for the.    
1a1f0 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20  ** two elements 
1a200 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1a210 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  se of the subque
1a220 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ry..    */.    i
1a230 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a  f( nSubSrc>1 ){.
1a240 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1a250 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c  Src = pSrc = sql
1a260 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1a270 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75  ge(db, pSrc, nSu
1a280 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b  bSrc-1,iFrom+1);
1a290 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  .      if( db->m
1a2a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1a2b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1a2c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1a2d0 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65   /* Transfer the
1a2e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1a2f0 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71  ms from the subq
1a300 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
1a310 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79    ** outer query
1a320 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
1a330 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b  (i=0; i<nSubSrc;
1a340 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1a350 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
1a360 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69  (db, pSrc->a[i+i
1a370 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20  From].pUsing);. 
1a380 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69       pSrc->a[i+i
1a390 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d  From] = pSubSrc-
1a3a0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  >a[i];.      mem
1a3b0 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
1a3c0 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
1a3d0 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
1a3e0 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
1a3f0 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65  [iFrom].jointype
1a400 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a   = jointype;.  .
1a410 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e      /* Now begin
1a420 20 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75   substituting su
1a430 62 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65  bquery result se
1a440 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  t expressions fo
1a450 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  r .    ** refere
1a460 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72  nces to the iPar
1a470 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ent in the outer
1a480 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a   query..    ** .
1a490 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
1a4a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1a4b0 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30  SELECT a+5, b*10
1a4c0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a   FROM (SELECT x*
1a4d0 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20  3 AS a, y+10 AS 
1a4e0 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  b FROM t1) WHERE
1a4f0 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c   a>b;.    **   \
1a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a510 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1a520 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f  ___ subquery ___
1a530 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
1a540 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f    /.    **    \_
1a550 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a560 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79  ____ outer query
1a570 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   _______________
1a580 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
1a590 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
1a5a0 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20  e look at every 
1a5b0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
1a5c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
1a5d0 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
1a5e0 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20   see.    ** "a" 
1a5f0 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78  we substitute "x
1a600 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c  *3" and every pl
1a610 61 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77  ace we see "b" w
1a620 65 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b  e substitute "y+
1a630 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  10"..    */.    
1a640 70 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d  pList = pParent-
1a650 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72  >pEList;.    for
1a660 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1a670 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1a680 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
1a690 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ].zName==0 ){.  
1a6a0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1a6b0 20 2a 7a 53 70 61 6e 20 3d 20 70 4c 69 73 74 2d   *zSpan = pList-
1a6c0 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20  >a[i].zSpan;.   
1a6d0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
1a6e0 7a 53 70 61 6e 29 20 29 7b 0a 20 20 20 20 20 20  zSpan) ){.      
1a6f0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1a700 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
1a710 62 53 74 72 44 75 70 28 64 62 2c 20 7a 53 70 61  bStrDup(db, zSpa
1a720 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
1a730 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a740 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1a750 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  , pParent->pELis
1a760 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  t, iParent, pSub
1a770 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69  ->pEList);.    i
1a780 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20  f( isAgg ){.    
1a790 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1a7a0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72  db, pParent->pGr
1a7b0 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  oupBy, iParent, 
1a7c0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1a7d0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
1a7e0 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70  aving = substExp
1a7f0 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
1a800 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
1a810 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1a820 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
1a830 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
1a840 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1a850 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d  arent->pOrderBy=
1a860 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
1a870 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ent->pOrderBy = 
1a880 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pSub->pOrderBy;.
1a890 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64        pSub->pOrd
1a8a0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erBy = 0;.    }e
1a8b0 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d  lse if( pParent-
1a8c0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
1a8d0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1a8e0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f  (db, pParent->pO
1a8f0 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c  rderBy, iParent,
1a900 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
1a910 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
1a920 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20  ub->pWhere ){.  
1a930 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
1a940 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
1a950 70 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29  pSub->pWhere, 0)
1a960 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a970 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
1a980 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62     }.    if( sub
1a990 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
1a9a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1a9b0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ent->pHaving==0 
1a9c0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1a9d0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72  ->pHaving = pPar
1a9e0 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  ent->pWhere;.   
1a9f0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
1aa00 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20  re = pWhere;.   
1aa10 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
1aa20 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
1aa30 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
1aa40 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
1aa50 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1aa60 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
1aa70 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
1aa80 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e  prAnd(db, pParen
1aa90 74 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20  t->pHaving, .   
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1aac0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
1aad0 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c  , pSub->pHaving,
1aae0 20 30 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65   0));.      asse
1aaf0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72  rt( pParent->pGr
1ab00 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
1ab10 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75    pParent->pGrou
1ab20 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
1ab30 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 53 75  rListDup(db, pSu
1ab40 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b  b->pGroupBy, 0);
1ab50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ab60 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
1ab70 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  e = substExpr(db
1ab80 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
1ab90 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
1aba0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
1abb0 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1abc0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
1abd0 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  d(db, pParent->p
1abe0 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a  Where, pWhere);.
1abf0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
1ac00 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75  The flattened qu
1ac10 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20  ery is distinct 
1ac20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e  if either the in
1ac30 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ner or the.    *
1ac40 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  * outer query is
1ac50 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20   distinct. .    
1ac60 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  */.    pParent->
1ac70 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62  selFlags |= pSub
1ac80 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1ac90 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20  Distinct;.  .   
1aca0 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43   /*.    ** SELEC
1acb0 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
1acc0 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
1acd0 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
1ace0 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a   OFFSET y;.    *
1acf0 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20  *.    ** One is 
1ad00 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74  tempted to try t
1ad10 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f  o add a and b to
1ad20 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d   combine the lim
1ad30 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20  its.  But this. 
1ad40 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77     ** does not w
1ad50 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69  ork if either li
1ad60 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
1ad70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ad80 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
1ad90 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1ada0 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c  Limit = pSub->pL
1adb0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62  imit;.      pSub
1adc0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1add0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1ade0 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77  nially, delete w
1adf0 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74  hat is left of t
1ae00 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1ae10 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63  return.  ** succ
1ae20 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
1ae30 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1ae40 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20 72  db, pSub1);..  r
1ae50 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
1ae60 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
1ae70 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1ae80 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1ae90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1aea0 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  ) */../*.** Anal
1aeb0 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  yze the SELECT s
1aec0 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
1aed0 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74  as an argument t
1aee0 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69  o see if it.** i
1aef0 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  s a min() or max
1af00 28 29 20 71 75 65 72 79 2e 20 52 65 74 75 72 6e  () query. Return
1af10 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
1af20 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45  IN or WHERE_ORDE
1af30 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69  RBY_MAX if .** i
1af40 74 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65 72  t is, or 0 other
1af50 77 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e 74  wise. At present
1af60 2c 20 61 20 71 75 65 72 79 20 69 73 20 63 6f 6e  , a query is con
1af70 73 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a  sidered to be.**
1af80 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71   a min()/max() q
1af90 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  uery if:.**.**  
1afa0 20 31 2e 20 54 68 65 72 65 20 69 73 20 61 20 73   1. There is a s
1afb0 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20  ingle object in 
1afc0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
1afd0 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72  .**.**   2. Ther
1afe0 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65 78  e is a single ex
1aff0 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
1b000 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20  result set, and 
1b010 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65 69  it is.**      ei
1b020 74 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d  ther min(x) or m
1b030 61 78 28 78 29 2c 20 77 68 65 72 65 20 78 20 69  ax(x), where x i
1b040 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  s a column refer
1b050 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
1b060 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 53  u8 minMaxQuery(S
1b070 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78 70  elect *p){.  Exp
1b080 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72  r *pExpr;.  Expr
1b090 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
1b0a0 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28  ->pEList;..  if(
1b0b0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
1b0c0 31 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45  1 ) return WHERE
1b0d0 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
1b0e0 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73  .  pExpr = pELis
1b0f0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
1b100 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
1b110 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
1b120 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1b130 28 20 4e 45 56 45 52 28 45 78 70 72 48 61 73 50  ( NEVER(ExprHasP
1b140 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1b150 50 5f 78 49 73 53 65 6c 65 63 74 29 29 20 29 20  P_xIsSelect)) ) 
1b160 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 45 4c 69  return 0;.  pELi
1b170 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
1b180 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  ist;.  if( pELis
1b190 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e  t==0 || pEList->
1b1a0 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
1b1b0 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  n 0;.  if( pELis
1b1c0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[0].pExpr->o
1b1d0 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p!=TK_AGG_COLUMN
1b1e0 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f   ) return WHERE_
1b1f0 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
1b200 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1b210 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1b220 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1b230 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
1b240 74 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e  trICmp(pExpr->u.
1b250 7a 54 6f 6b 65 6e 2c 22 6d 69 6e 22 29 3d 3d 30  zToken,"min")==0
1b260 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
1b270 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
1b280 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
1b290 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78  lite3StrICmp(pEx
1b2a0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61  pr->u.zToken,"ma
1b2b0 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  x")==0 ){.    re
1b2c0 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
1b2d0 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72 65  BY_MAX;.  }.  re
1b2e0 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
1b2f0 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a  BY_NORMAL;.}../*
1b300 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73  .** The select s
1b310 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
1b320 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
1b330 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72  ument is an aggr
1b340 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20  egate query..** 
1b350 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d 65  The second argme
1b360 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
1b370 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
1b380 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
1b390 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
1b3a0 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
1b3b0 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
1b3c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
1b3d0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
1b3e0 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
1b3f0 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
1b400 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
1b410 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
1b420 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
1b430 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
1b440 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
1b450 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
1b460 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
1b470 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
1b480 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
1b490 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
1b4a0 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
1b4b0 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
1b4c0 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
1b4d0 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
1b4e0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
1b4f0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
1b500 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
1b510 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
1b520 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
1b530 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
1b540 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
1b550 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
1b560 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
1b570 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
1b580 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1b590 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
1b5a0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
1b5b0 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
1b5c0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
1b5d0 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
1b5e0 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
1b5f0 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
1b600 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
1b610 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
1b620 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
1b630 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
1b640 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
1b650 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67  .  if( NEVER(pAg
1b660 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29  gInfo->nFunc==0)
1b670 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1b680 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
1b690 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 6c  unc[0].pFunc->fl
1b6a0 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f  ags&SQLITE_FUNC_
1b6b0 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75  COUNT)==0 ) retu
1b6c0 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70  rn 0;.  if( pExp
1b6d0 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74  r->flags&EP_Dist
1b6e0 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  inct ) return 0;
1b6f0 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  ..  return pTab;
1b700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
1b710 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65   source-list ite
1b720 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  m passed as an a
1b730 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d  rgument was augm
1b740 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a  ented with an.**
1b750 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1b760 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  se, then try to 
1b770 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69  locate the speci
1b780 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74  fied index. If t
1b790 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68  here.** was such
1b7a0 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68   a clause and th
1b7b0 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61  e named index ca
1b7c0 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72  nnot be found, r
1b7d0 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
1b7e0 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65  _ERROR and leave
1b7f0 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
1b800 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rse. Otherwise, 
1b810 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72  populate .** pFr
1b820 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72  om->pIndex and r
1b830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
1b840 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
1b850 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50  ndexedByLookup(P
1b860 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
1b870 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1b880 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  m *pFrom){.  if(
1b890 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20   pFrom->pTab && 
1b8a0 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b  pFrom->zIndex ){
1b8b0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1b8c0 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
1b8d0 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78      char *zIndex
1b8e0 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78   = pFrom->zIndex
1b8f0 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
1b900 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
1b910 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
1b920 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73         pIdx && s
1b930 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
1b940 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65  dx->zName, zInde
1b950 78 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  x); .        pId
1b960 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20  x=pIdx->pNext.  
1b970 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49    );.    if( !pI
1b980 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  dx ){.      sqli
1b990 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1b9a0 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
1b9b0 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c  ex: %s", zIndex,
1b9c0 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73   0);.      pPars
1b9d0 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
1b9e0 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
1b9f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1ba00 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e     }.    pFrom->
1ba10 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
1ba20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1ba30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1ba40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1ba50 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  a Walker callbac
1ba60 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67  k for "expanding
1ba70 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
1ba80 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64  ment..** "Expand
1ba90 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f  ing" means to do
1baa0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
1bab0 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
1bac0 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
1bad0 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
1bae0 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
1baf0 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
1bb00 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
1bb10 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
1bb20 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
1bb30 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
1bb40 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
1bb50 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
1bb60 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
1bb70 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
1bb80 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
1bb90 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
1bba0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
1bbb0 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
1bbc0 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
1bbd0 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
1bbe0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
1bbf0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
1bc00 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
1bc10 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
1bc20 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
1bc30 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
1bc40 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
1bc50 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
1bc60 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
1bc70 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
1bc80 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
1bc90 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
1bca0 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
1bcb0 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
1bcc0 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  resistent repres
1bcd0 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
1bce0 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
1bcf0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
1bd00 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
1bd10 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
1bd20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e  accomodate the N
1bd30 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
1bd40 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
1bd50 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
1bd60 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
1bd70 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
1bd80 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
1bd90 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
1bda0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1bdb0 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
1bdc0 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
1bdd0 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
1bde0 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
1bdf0 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
1be00 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
1be10 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
1be20 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
1be30 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
1be40 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
1be50 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
1be60 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
1be70 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
1be80 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  LE..**.*/.static
1be90 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e   int selectExpan
1bea0 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  der(Walker *pWal
1beb0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
1bec0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1bed0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
1bee0 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  se;.  int i, j, 
1bef0 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  k;.  SrcList *pT
1bf00 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
1bf10 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74  st *pEList;.  st
1bf20 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1bf30 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69  m *pFrom;.  sqli
1bf40 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1bf50 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d  ->db;..  if( db-
1bf60 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29  >mallocFailed  )
1bf70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
1bf80 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66  _Abort;.  }.  if
1bf90 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d  ( NEVER(p->pSrc=
1bfa0 3d 30 29 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c  =0) || (p->selFl
1bfb0 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
1bfc0 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  d)!=0 ){.    ret
1bfd0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
1bfe0 20 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73   }.  p->selFlags
1bff0 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b   |= SF_Expanded;
1c000 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
1c010 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
1c020 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
1c030 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72  /* Make sure cur
1c040 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
1c050 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
1c060 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  o all entries in
1c070 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
1c080 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c  lause of the SEL
1c090 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
1c0a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63   */.  sqlite3Src
1c0b0 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
1c0c0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
1c0d0 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  st);..  /* Look 
1c0e0 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e  up every table n
1c0f0 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d  amed in the FROM
1c100 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1c110 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20  elect.  If.  ** 
1c120 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
1c130 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61  FROM clause is a
1c140 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61   subquery instea
1c150 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  d of a table or 
1c160 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  view,.  ** then 
1c170 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65  create a transie
1c180 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
1c190 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74  re to describe t
1c1a0 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a  he subquery..  *
1c1b0 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  /.  for(i=0, pFr
1c1c0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
1c1d0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
1c1e0 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
1c1f0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
1c200 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
1c210 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20  >pTab!=0 ){.    
1c220 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d    /* This statem
1c230 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  ent has already 
1c240 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20  been prepared.  
1c250 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
1c260 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20  .      ** to go 
1c270 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  further. */.    
1c280 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29    assert( i==0 )
1c290 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
1c2a0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
1c2b0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
1c2c0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Name==0 ){.#ifnd
1c2d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1c2e0 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65  UBQUERY.      Se
1c2f0 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
1c300 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
1c310 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
1c320 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
1c330 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
1c340 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1c350 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20  ( pSel!=0 );.   
1c360 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
1c370 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
1c380 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
1c390 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
1c3a0 65 6c 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  el);.      pFrom
1c3b0 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
1c3c0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1c3d0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
1c3e0 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66  able));.      if
1c3f0 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
1c400 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1c410 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d      pTab->nRef =
1c420 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   1;.      pTab->
1c430 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
1c440 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
1c450 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22  te_subquery_%p_"
1c460 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a  , (void*)pTab);.
1c470 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
1c480 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65  l->pPrior ){ pSe
1c490 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
1c4a0 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74  ; }.      select
1c4b0 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
1c4c0 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
1c4d0 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
1c4e0 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
1c4f0 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ol);.      pTab-
1c500 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
1c510 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74     pTab->nRowEst
1c520 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 20 20   = 1000000;.    
1c530 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
1c540 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
1c550 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
1c560 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
1c570 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
1c580 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
1c590 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
1c5a0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1c5b0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
1c5c0 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
1c5d0 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
1c5e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
1c5f0 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
1c600 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70  0,pFrom->zName,p
1c610 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  From->zDatabase)
1c620 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
1c630 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1c640 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
1c650 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20  ab->nRef++;.#if 
1c660 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1c670 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
1c680 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
1c690 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1c6a0 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ).      if( pTab
1c6b0 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56  ->pSelect || IsV
1c6c0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
1c6d0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
1c6e0 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
1c6f0 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
1c700 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
1c710 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
1c720 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
1c730 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
1c740 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
1c750 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
1c760 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
1c770 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  >pSelect==0 );. 
1c780 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
1c790 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
1c7a0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
1c7b0 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  b->pSelect, 0);.
1c7c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1c7d0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
1c7e0 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  r, pFrom->pSelec
1c7f0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
1c800 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
1c810 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65   Locate the inde
1c820 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49  x named by the I
1c830 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1c840 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
1c850 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
1c860 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72  xedByLookup(pPar
1c870 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
1c880 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
1c890 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bort;.    }.  }.
1c8a0 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
1c8b0 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
1c8c0 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
1c8d0 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
1c8e0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
1c8f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
1c900 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  | sqliteProcessJ
1c910 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
1c920 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
1c930 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f  _Abort;.  }..  /
1c940 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
1c950 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
1c960 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
1c970 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
1c980 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
1c990 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
1c9a0 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
1c9b0 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
1c9c0 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
1c9d0 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
1c9e0 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
1c9f0 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
1ca00 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
1ca10 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
1ca20 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f  e TK_ALL operato
1ca30 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
1ca40 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
1ca50 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e  the column list.
1ca60 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
1ca70 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
1ca80 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
1ca90 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f  TK_ALL expressio
1caa0 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20  ns and expand.  
1cab0 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  ** each one to t
1cac0 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
1cad0 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
1cae0 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
1caf0 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
1cb00 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
1cb10 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
1cb20 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
1cb30 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
1cb40 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
1cb50 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
1cb60 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
1cb70 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
1cb80 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
1cb90 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
1cba0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
1cbb0 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
1cbc0 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
1cbd0 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30  || pE->pRight!=0
1cbe0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1cbf0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
1cc00 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  | (pE->pLeft!=0 
1cc10 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
1cc20 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20  ==TK_ID) );.    
1cc30 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
1cc40 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  OT && pE->pRight
1cc50 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
1cc60 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
1cc70 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
1cc80 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
1cc90 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
1cca0 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
1ccb0 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
1ccc0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
1ccd0 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
1cce0 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1ccf0 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
1cd00 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
1cd10 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
1cd20 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
1cd30 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
1cd40 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
1cd50 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
1cd60 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1cd70 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
1cd80 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
1cd90 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
1cda0 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
1cdb0 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
1cdc0 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
1cdd0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
1cde0 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce00 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
1ce10 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
1ce20 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
1ce30 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
1ce40 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
1ce50 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
1ce60 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[k].pExpr;.   
1ce70 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
1ce80 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
1ce90 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
1cea0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
1ceb0 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f  TK_ALL && (pE->o
1cec0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
1ced0 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f  >pRight->op!=TK_
1cee0 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ALL) ){.        
1cef0 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  /* This particul
1cf00 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  ar expression do
1cf10 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1cf20 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20  e expanded..    
1cf30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
1cf40 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1cf50 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1cf60 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  se, pNew, a[k].p
1cf70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
1cf80 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
1cf90 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
1cfa0 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
1cfb0 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
1cfc0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1cfd0 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
1cfe0 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53  .zSpan = a[k].zS
1cff0 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  pan;.          a
1d000 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [k].zName = 0;. 
1d010 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53           a[k].zS
1d020 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pan = 0;.       
1d030 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e   }.        a[k].
1d040 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
1d050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d060 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
1d070 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
1d080 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
1d090 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
1d0a0 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
1d0b0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
1d0c0 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
1d0d0 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
1d0e0 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
1d0f0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
1d100 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20  r *zTName;      
1d110 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
1d120 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
1d130 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
1d140 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
1d150 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1d160 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
1d170 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1d180 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1d190 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
1d1a0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1d1b0 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
1d1c0 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
1d1d0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
1d1e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d1f0 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   zTName = 0;.   
1d200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
1d210 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
1d220 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
1d230 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1d240 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
1d250 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
1d260 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
1d270 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
1d280 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f  *zTabName = pFro
1d290 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
1d2a0 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
1d2b0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1d2c0 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
1d2d0 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
1d2e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d2f0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1d300 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
1d310 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
1d320 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53  Name && sqlite3S
1d330 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a  trICmp(zTName, z
1d340 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  TabName)!=0 ){. 
1d350 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1d360 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
1d370 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65  .          table
1d380 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
1d390 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1d3a0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
1d3b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
1d3c0 72 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68  r *pExpr, *pRigh
1d3d0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  t;.            c
1d3e0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61  har *zName = pTa
1d3f0 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b->aCol[j].zName
1d400 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
1d410 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f  ar *zColname;  /
1d420 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63  * The computed c
1d430 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
1d440 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1d450 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61  zToFree;   /* Ma
1d460 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68  lloced string th
1d470 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  at needs to be f
1d480 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  reed */.        
1d490 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61      Token sColna
1d4a0 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64  me;  /* Computed
1d4b0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20   column name as 
1d4c0 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20  a token */..    
1d4d0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
1d4e0 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64  column is marked
1d4f0 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75   as 'hidden' (cu
1d500 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73  rrently only pos
1d510 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  sible.          
1d520 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c    ** for virtual
1d530 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74   tables), do not
1d540 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74   include it in t
1d550 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20  he expanded.    
1d560 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c          ** resul
1d570 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20  t-set list..    
1d580 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1d590 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64         if( IsHid
1d5a0 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d  denColumn(&pTab-
1d5b0 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20  >aCol[j]) ){.   
1d5c0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1d5d0 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  t(IsVirtual(pTab
1d5e0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
1d5f0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1d600 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1d610 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
1d620 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  & zTName==0 ){. 
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1d640 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70   (pFrom->jointyp
1d650 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
1d660 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
1d670 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
1d680 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
1d690 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
1d6a0 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
1d6b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
1d6c0 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
1d6d0 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
1d6e0 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
1d6f0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
1d700 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
1d710 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
1d720 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
1d730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d740 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1d750 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d760 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1d770 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
1d780 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
1d790 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
1d7a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1d7b0 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
1d7c0 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
1d7d0 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
1d7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d7f0 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
1d800 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
1d810 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
1d820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d830 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1d840 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d850 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d860 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
1d870 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
1d880 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
1d890 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
1d8a0 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
1d8b0 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
1d8c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1d8d0 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
1d8e0 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
1d8f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
1d900 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
1d920 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
1d930 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
1d940 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
1d950 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
1d960 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1d970 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
1d980 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
1d990 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d9a0 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
1d9c0 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  lname = sqlite3M
1d9d0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
1d9e0 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
1d9f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1da00 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
1da10 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
1da20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1da30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1da40 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1da50 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
1da60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1da70 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
1da80 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1da90 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
1daa0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1dab0 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d      sColname.z =
1dac0 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20   zColname;.     
1dad0 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e         sColname.
1dae0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
1daf0 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  n30(zColname);. 
1db00 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1db10 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
1db20 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  e(pParse, pNew, 
1db30 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20  &sColname, 0);. 
1db40 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1db50 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f  e3DbFree(db, zTo
1db60 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
1db70 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1db80 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53       if( !tableS
1db90 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  een ){.         
1dba0 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20   if( zTName ){. 
1dbb0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1dbc0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1dbd0 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  e, "no such tabl
1dbe0 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b  e: %s", zTName);
1dbf0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1dc00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1dc10 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1dc20 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73  arse, "no tables
1dc30 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20   specified");.  
1dc40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dc50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1dc60 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
1dc70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
1dc80 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
1dc90 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
1dca0 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
1dcb0 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
1dcc0 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70  ->pEList && p->p
1dcd0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d  EList->nExpr>db-
1dce0 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
1dcf0 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
1dd00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1dd10 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
1dd20 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
1dd30 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20   result set");. 
1dd40 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
1dd50 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1dd60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
1dd70 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
1dd80 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
1dd90 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
1dda0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
1ddb0 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  e Walker.xExprCa
1ddc0 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72  llback then expr
1ddd0 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20  ession trees.** 
1dde0 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f  are walked witho
1ddf0 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62  ut any actions b
1de00 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61  eing taken at ea
1de10 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d  ch node.  Presum
1de20 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68  ably,.** when th
1de30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1de40 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45  ed for Walker.xE
1de50 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
1de60 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c   .** Walker.xSel
1de70 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73  ectCallback is s
1de80 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  et to do somethi
1de90 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76  ng useful for ev
1dea0 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79  ery .** subquery
1deb0 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74   in the parser t
1dec0 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
1ded0 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28  nt exprWalkNoop(
1dee0 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
1def0 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29   Expr *NotUsed2)
1df00 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1df10 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
1df20 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
1df30 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1df40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1df50 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22  outine "expands"
1df60 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1df70 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ent and all of i
1df80 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  ts subqueries..*
1df90 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * For additional
1dfa0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
1dfb0 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f  what it means to
1dfc0 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45   "expand" a SELE
1dfd0 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c  CT.** statement,
1dfe0 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   see the comment
1dff0 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78   on the selectEx
1e000 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c  pand worker call
1e010 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  back above..**.*
1e020 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45  * Expanding a SE
1e030 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
1e040 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70  s the first step
1e050 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61   in processing a
1e060 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
1e070 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43  ment.  The SELEC
1e080 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74  T statement must
1e090 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66   be expanded bef
1e0a0 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f  ore.** name reso
1e0b0 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72  lution is perfor
1e0c0 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  med..**.** If an
1e0d0 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
1e0e0 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  g, an error mess
1e0f0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
1e100 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54  nto pParse..** T
1e110 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1e120 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74  ion can detect t
1e130 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f  he problem by lo
1e140 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d  oking at pParse-
1e150 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20  >nErr.** and/or 
1e160 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
1e170 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61  ocFailed..*/.sta
1e180 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
1e190 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72  SelectExpand(Par
1e1a0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
1e1b0 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
1e1c0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53  Walker w;.  w.xS
1e1d0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
1e1e0 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a  selectExpander;.
1e1f0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
1e200 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
1e210 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
1e220 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
1e230 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
1e240 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66  Select);.}...#if
1e250 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e260 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
1e270 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72  This is a Walker
1e280 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1e290 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68   callback for th
1e2a0 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  e sqlite3SelectT
1e2b0 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74  ypeInfo().** int
1e2c0 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  erface..**.** Fo
1e2d0 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75  r each FROM-clau
1e2e0 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64  se subquery, add
1e2f0 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e   Column.zType an
1e300 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a  d Column.zColl.*
1e310 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  * information to
1e320 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
1e330 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
1e340 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
1e350 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73  set.** of that s
1e360 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  ubquery..**.** T
1e370 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
1e380 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  re that represen
1e390 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ts the result se
1e3a0 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65  t was constructe
1e3b0 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78  d.** by selectEx
1e3c0 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65  pander() but the
1e3d0 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74   type and collat
1e3e0 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ion information 
1e3f0 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61  was omitted.** a
1e400 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63  t that point bec
1e410 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73  ause identifiers
1e420 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65   had not yet bee
1e430 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69  n resolved.  Thi
1e440 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
1e450 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65  called after ide
1e460 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69  ntifier resoluti
1e470 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1e480 74 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  t selectAddSubqu
1e490 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b  eryTypeInfo(Walk
1e4a0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
1e4b0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
1e4c0 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20   *pParse;.  int 
1e4d0 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  i;.  SrcList *pT
1e4e0 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
1e4f0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1e500 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  From;..  assert(
1e510 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
1e520 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20  F_Resolved );.  
1e530 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
1e540 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
1e550 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  o)==0 ){.    p->
1e560 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48  selFlags |= SF_H
1e570 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20  asTypeInfo;.    
1e580 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
1e590 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54  ->pParse;.    pT
1e5a0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
1e5b0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
1e5c0 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
1e5d0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
1e5e0 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
1e5f0 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
1e600 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
1e610 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c  ab;.      if( AL
1e620 57 41 59 53 28 70 54 61 62 21 3d 30 29 20 26 26  WAYS(pTab!=0) &&
1e630 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
1e640 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
1e650 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
1e660 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
1e670 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1e680 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
1e690 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
1e6a0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
1e6b0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 61  elect;.        a
1e6c0 73 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20  ssert( pSel );. 
1e6d0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
1e6e0 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
1e6f0 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
1e700 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
1e710 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
1e720 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
1e730 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54  , pTab->nCol, pT
1e740 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 29 3b  ab->aCol, pSel);
1e750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e760 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
1e770 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64  Continue;.}.#end
1e780 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
1e790 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74  routine adds dat
1e7a0 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74  atype and collat
1e7b0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66  ing sequence inf
1e7c0 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74  ormation to.** t
1e7d0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
1e7e0 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d  res of all FROM-
1e7f0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
1e800 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54  s in a.** SELECT
1e810 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
1e820 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69  * Use this routi
1e830 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65  ne after name re
1e840 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
1e850 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
1e860 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
1e870 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
1e880 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
1e890 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1e8a0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1e8b0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
1e8c0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1e8d0 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  = selectAddSubqu
1e8e0 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77  eryTypeInfo;.  w
1e8f0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
1e900 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20   exprWalkNoop;. 
1e910 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
1e920 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
1e930 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
1e940 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ect);.#endif.}..
1e950 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1e960 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45  ine sets up a SE
1e970 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
1e980 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  or processing.  
1e990 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
1e9a0 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
1e9b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56  :.**.**     *  V
1e9c0 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65  DBE Cursor numbe
1e9d0 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  rs are assigned 
1e9e0 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  to all FROM-clau
1e9f0 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20  se terms..**    
1ea00 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61   *  Ephemeral Ta
1ea10 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ble objects are 
1ea20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
1ea30 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
1ea40 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a  ueries..**     *
1ea50 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63    ON and USING c
1ea60 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74  lauses are shift
1ea70 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74  ed into WHERE st
1ea80 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  atements.**     
1ea90 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22  *  Wildcards "*"
1eaa0 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69   and "TABLE.*" i
1eab0 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72  n result sets ar
1eac0 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20  e expanded..**  
1ead0 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72     *  Identifier
1eae0 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s in expression 
1eaf0 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74  are matched to t
1eb00 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ables..**.** Thi
1eb10 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72  s routine acts r
1eb20 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c  ecursively on al
1eb30 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  l subqueries wit
1eb40 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a  hin the SELECT..
1eb50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1eb60 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72  electPrep(.  Par
1eb70 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1eb80 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
1eb90 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
1eba0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1ebb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
1ebc0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
1ebd0 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
1ebe0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
1ebf0 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63  terNC  /* Name c
1ec00 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61  ontext for conta
1ec10 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  iner */.){.  sql
1ec20 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
1ec30 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
1ec40 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61  turn;.  db = pPa
1ec50 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
1ec60 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1ec70 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65  HasTypeInfo ) re
1ec80 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
1ec90 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72  electExpand(pPar
1eca0 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50  se, p);.  if( pP
1ecb0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
1ecc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1ecd0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
1ece0 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e  e3ResolveSelectN
1ecf0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ames(pParse, p, 
1ed00 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28  pOuterNC);.  if(
1ed10 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
1ed20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1ed30 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
1ed40 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
1ed50 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  peInfo(pParse, p
1ed60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  );.}../*.** Rese
1ed70 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  t the aggregate 
1ed80 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a  accumulator..**.
1ed90 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65  ** The aggregate
1eda0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20   accumulator is 
1edb0 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20  a set of memory 
1edc0 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a  cells that hold.
1edd0 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
1ede0 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61  results while ca
1edf0 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67  lculating an agg
1ee00 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a  regate.  This.**
1ee10 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
1ee20 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f  es code that sto
1ee30 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c  res NULLs in all
1ee40 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79   of those memory
1ee50 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  .** cells..*/.st
1ee60 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41  atic void resetA
1ee70 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
1ee80 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
1ee90 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1eea0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1eeb0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1eec0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1eed0 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  fo_func *pFunc;.
1eee0 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e    if( pAggInfo->
1eef0 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e  nFunc+pAggInfo->
1ef00 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20  nColumn==0 ){.  
1ef10 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1ef20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
1ef30 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  nfo->nColumn; i+
1ef40 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
1ef50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ef60 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66  Null, 0, pAggInf
1ef70 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29  o->aCol[i].iMem)
1ef80 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e  ;.  }.  for(pFun
1ef90 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  c=pAggInfo->aFun
1efa0 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  c, i=0; i<pAggIn
1efb0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
1efc0 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71  pFunc++){.    sq
1efd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1efe0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
1eff0 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20  Func->iMem);.   
1f000 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73   if( pFunc->iDis
1f010 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
1f020 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75    Expr *pE = pFu
1f030 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  nc->pExpr;.     
1f040 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1f050 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50  sProperty(pE, EP
1f060 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1f070 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70       if( pE->x.p
1f080 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78  List==0 || pE->x
1f090 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  .pList->nExpr!=1
1f0a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1f0b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1f0c0 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67  se, "DISTINCT ag
1f0d0 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61  gregates must ha
1f0e0 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22  ve exactly one "
1f0f0 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67  .           "arg
1f100 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20  ument");.       
1f110 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
1f120 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  t = -1;.      }e
1f130 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  lse{.        Key
1f140 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
1f150 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
1f160 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d  List(pParse, pE-
1f170 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
1f180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f190 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
1f1a0 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d  phemeral, pFunc-
1f1b0 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30  >iDistinct, 0, 0
1f1c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f1d0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1f1e0 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
1f1f0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
1f200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f210 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
1f220 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69  oke the OP_AggFi
1f230 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f  nalize opcode fo
1f240 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74  r every aggregat
1f250 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  e function.** in
1f260 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
1f270 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
1f280 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41  c void finalizeA
1f290 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73  ggFunctions(Pars
1f2a0 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
1f2b0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
1f2c0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1f2d0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1f2e0 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
1f2f0 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
1f300 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
1f310 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
1f320 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
1f330 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
1f340 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
1f350 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
1f360 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
1f370 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1f380 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
1f390 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
1f3a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f3b0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp4(v, OP_AggFi
1f3c0 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
1f3d0 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
1f3e0 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20  xpr : 0, 0,.    
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f400 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
1f410 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
1f420 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
1f430 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
1f440 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
1f450 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
1f460 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
1f470 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
1f480 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
1f490 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
1f4a0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
1f4b0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
1f4c0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
1f4d0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1f4e0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1f4f0 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74   i;.  int regHit
1f500 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72   = 0;.  int addr
1f510 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73  HitTest = 0;.  s
1f520 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
1f530 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
1f540 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
1f550 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
1f560 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
1f570 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1f580 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
1f590 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
1f5a0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
1f5b0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
1f5c0 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
1f5d0 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
1f5e0 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30  int addrNext = 0
1f5f0 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67  ;.    int regAgg
1f600 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
1f610 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
1f620 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
1f630 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1f640 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
1f650 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1f660 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
1f670 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67  st ){.      nArg
1f680 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
1f690 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
1f6a0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
1f6b0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67  nge(pParse, nArg
1f6c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f6d0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
1f6e0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
1f6f0 72 65 67 41 67 67 2c 20 31 29 3b 0a 20 20 20 20  regAgg, 1);.    
1f700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
1f710 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67  g = 0;.      reg
1f720 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Agg = 0;.    }. 
1f730 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74     if( pF->iDist
1f740 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
1f750 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
1f760 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1f770 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  (v);.      asser
1f780 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20  t( nArg==1 );.  
1f790 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
1f7a0 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69  (pParse, pF->iDi
1f7b0 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74  stinct, addrNext
1f7c0 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20  , 1, regAgg);.  
1f7d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
1f7e0 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53  pFunc->flags & S
1f7f0 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
1f800 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  OLL ){.      Col
1f810 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
1f820 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
1f830 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1f840 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  em;.      int j;
1f850 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f860 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70  List!=0 );  /* p
1f870 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70  List!=0 if pF->p
1f880 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c  Func has NEEDCOL
1f890 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a  L */.      for(j
1f8a0 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
1f8b0 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c  >a; !pColl && j<
1f8c0 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d  nArg; j++, pItem
1f8d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  ++){.        pCo
1f8e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1f8f0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1f900 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
1f910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f920 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
1f930 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73     pColl = pPars
1f940 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
1f950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f960 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26  if( regHit==0 &&
1f970 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75   pAggInfo->nAccu
1f980 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74  mulator ) regHit
1f990 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1f9a0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1f9b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1f9c0 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74  _CollSeq, regHit
1f9d0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
1f9e0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
1f9f0 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  Q);.    }.    sq
1fa00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1fa10 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30  v, OP_AggStep, 0
1fa20 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d  , regAgg, pF->iM
1fa30 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  em,.            
1fa40 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
1fa50 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
1fa60 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c  UNCDEF);.    sql
1fa70 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1fa80 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20  (v, (u8)nArg);. 
1fa90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1faa0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1fab0 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
1fac0 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  , nArg);.    sql
1fad0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1fae0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
1faf0 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
1fb00 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a  if( addrNext ){.
1fb10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fb20 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1fb30 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20   addrNext);.    
1fb40 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1fb50 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
1fb60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1fb70 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69   Before populati
1fb80 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
1fb90 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c  or registers, cl
1fba0 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  ear the column c
1fbb0 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  ache..  ** Other
1fbc0 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20  wise, if any of 
1fbd0 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c  the required col
1fbe0 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61  umn values are a
1fbf0 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a  lready present .
1fc00 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72    ** in register
1fc10 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  s, sqlite3ExprCo
1fc20 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f  de() may use OP_
1fc30 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68  SCopy to copy th
1fc40 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20  e value.  ** to 
1fc50 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79  pC->iMem. But by
1fc60 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61   the time the va
1fc70 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65  lue is used, the
1fc80 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74   original regist
1fc90 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65  er.  ** may have
1fca0 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61   been used, inva
1fcb0 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64  lidating the und
1fcc0 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68  erlying buffer h
1fcd0 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  olding the.  ** 
1fce0 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c  text or blob val
1fcf0 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b  ue. See ticket [
1fd00 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a  883034dcb5]..  *
1fd10 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73  *.  ** Another s
1fd20 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65  olution would be
1fd30 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f   to change the O
1fd40 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20  P_SCopy used to 
1fd50 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a  copy cached.  **
1fd60 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50   values to an OP
1fd70 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  _Copy..  */.  if
1fd80 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20  ( regHit ){.    
1fd90 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71  addrHitTest = sq
1fda0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1fdb0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74  v, OP_If, regHit
1fdc0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1fdd0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
1fde0 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d  Parse);.  for(i=
1fdf0 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pC=pAggInfo->
1fe00 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f  aCol; i<pAggInfo
1fe10 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20  ->nAccumulator; 
1fe20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20  i++, pC++){.    
1fe30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1fe40 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70  pParse, pC->pExp
1fe50 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20  r, pC->iMem);.  
1fe60 7d 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 30 3b 0a 20 20  rectMode = 0;.  
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 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74   if( addrHitTest
1feb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1fec0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
1fed0 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d  ddrHitTest);.  }
1fee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
1fef0 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69  single OP_Explai
1ff00 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  n instruction to
1ff10 20 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70   the VDBE to exp
1ff20 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a  lain a simple.**
1ff30 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20   count(*) query 
1ff40 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ("SELECT count(*
1ff50 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a  ) FROM pTab")..*
1ff60 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1ff70 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74  _OMIT_EXPLAIN.st
1ff80 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
1ff90 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20  nSimpleCount(.  
1ffa0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffc0 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
1ffd0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1ffe0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1fff0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
20000 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a  eing queried */.
20010 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20    Index *pIdx   
20020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20030 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20    /* Index used 
20040 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e  to optimize scan
20050 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  , or NULL */.){.
20060 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
20070 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
20080 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c  char *zEqp = sql
20090 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
200a0 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41  se->db, "SCAN TA
200b0 42 4c 45 20 25 73 20 25 73 25 73 28 7e 25 64 20  BLE %s %s%s(~%d 
200c0 72 6f 77 73 29 22 2c 0a 20 20 20 20 20 20 20 20  rows)",.        
200d0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20  pTab->zName, .  
200e0 20 20 20 20 20 20 70 49 64 78 20 3f 20 22 55 53        pIdx ? "US
200f0 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
20100 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20  EX " : "",.     
20110 20 20 20 70 49 64 78 20 3f 20 70 49 64 78 2d 3e     pIdx ? pIdx->
20120 7a 4e 61 6d 65 20 3a 20 22 22 2c 0a 20 20 20 20  zName : "",.    
20130 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73      pTab->nRowEs
20140 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  t.    );.    sql
20150 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
20160 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
20170 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69  pVdbe, OP_Explai
20180 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
20190 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70  ctId, 0, 0, zEqp
201a0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20  , P4_DYNAMIC.   
201b0 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
201c0 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
201d0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c  SimpleCount(a,b,
201e0 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
201f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
20200 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  or the SELECT st
20210 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e  atement given in
20220 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e   the p argument.
20230 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73    .**.** The res
20240 75 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62  ults are distrib
20250 75 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20  uted in various 
20260 77 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  ways depending o
20270 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  n the.** content
20280 73 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44  s of the SelectD
20290 65 73 74 20 73 74 72 75 63 74 75 72 65 20 70 6f  est structure po
202a0 69 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67 75  inted to by argu
202b0 6d 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73  ment pDest.** as
202c0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
202d0 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
202e0 20 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20      Result.**   
202f0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20    ------------  
20300 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
20310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
20330 20 20 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20       SRT_Output 
20340 20 20 20 20 20 47 65 6e 65 72 61 74 65 20 61 20       Generate a 
20350 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75  row of output (u
20360 73 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75  sing the OP_Resu
20370 6c 74 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  ltRow.**        
20380 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 63               opc
20390 6f 64 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f  ode) for each ro
203a0 77 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  w in the result 
203b0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  set..**.**     S
203c0 52 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f  RT_Mem         O
203d0 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 74 68 65  nly valid if the
203e0 20 72 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e   result is a sin
203f0 67 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20  gle column..**  
20400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20410 20 20 20 53 74 6f 72 65 20 74 68 65 20 66 69 72     Store the fir
20420 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
20430 20 66 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f   first result ro
20440 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
20450 20 20 20 20 20 20 20 20 20 69 6e 20 72 65 67 69           in regi
20460 73 74 65 72 20 70 44 65 73 74 2d 3e 69 53 44 50  ster pDest->iSDP
20470 61 72 6d 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e  arm then abandon
20480 20 74 68 65 20 72 65 73 74 0a 2a 2a 20 20 20 20   the rest.**    
20490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204a0 20 6f 66 20 74 68 65 20 71 75 65 72 79 2e 20 20   of the query.  
204b0 54 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e  This destination
204c0 20 69 6d 70 6c 69 65 73 20 22 4c 49 4d 49 54 20   implies "LIMIT 
204d0 31 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  1"..**.**     SR
204e0 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 54 68  T_Set         Th
204f0 65 20 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65  e result must be
20500 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
20510 2e 20 20 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a  .  Store each.**
20520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20530 20 20 20 20 20 72 6f 77 20 6f 66 20 72 65 73 75       row of resu
20540 6c 74 20 61 73 20 74 68 65 20 6b 65 79 20 69 6e  lt as the key in
20550 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 53   table pDest->iS
20560 44 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20  DParm. .**      
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
20580 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74  pply the affinit
20590 79 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74  y pDest->affSdst
205a0 20 62 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 0a   before storing.
205b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
205c0 20 20 20 20 20 20 20 72 65 73 75 6c 74 73 2e 20         results. 
205d0 20 55 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   Used to impleme
205e0 6e 74 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e  nt "IN (SELECT .
205f0 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ..)"..**.**     
20600 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20  SRT_Union       
20610 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73  Store results as
20620 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70   a key in a temp
20630 6f 72 61 72 79 20 74 61 62 6c 65 20 0a 2a 2a 20  orary table .** 
20640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20650 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 62      identified b
20660 79 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  y pDest->iSDParm
20670 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
20680 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f  Except      Remo
20690 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ve results from 
206a0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
206b0 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ble pDest->iSDPa
206c0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
206d0 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53 74  T_Table       St
206e0 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  ore results in t
206f0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
20700 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a  Dest->iSDParm..*
20710 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
20720 20 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69        This is li
20730 6b 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20  ke SRT_EphemTab 
20740 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
20750 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
20760 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
20770 61 73 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61  assumed to alrea
20780 64 79 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a  dy be open..**.*
20790 2a 20 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54  *     SRT_EphemT
207a0 61 62 20 20 20 20 43 72 65 61 74 65 20 61 6e 20  ab    Create an 
207b0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
207c0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 61  pDest->iSDParm a
207d0 6e 64 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20  nd store.**     
207e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207f0 74 68 65 20 72 65 73 75 6c 74 20 74 68 65 72 65  the result there
20800 2e 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20  . The cursor is 
20810 6c 65 66 74 20 6f 70 65 6e 20 61 66 74 65 72 0a  left open after.
20820 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20830 20 20 20 20 20 20 20 72 65 74 75 72 6e 69 6e 67         returning
20840 2e 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20  .  This is like 
20850 53 52 54 5f 54 61 62 6c 65 20 65 78 63 65 70 74  SRT_Table except
20860 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
20880 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 75 73  s destination us
20890 65 73 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  es OP_OpenEpheme
208a0 72 61 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a  ral to create.**
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208c0 20 20 20 20 20 74 68 65 20 74 61 62 6c 65 20 66       the table f
208d0 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst..**.**     
208e0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20  SRT_Coroutine   
208f0 47 65 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f  Generate a co-ro
20900 75 74 69 6e 65 20 74 68 61 74 20 72 65 74 75 72  utine that retur
20910 6e 73 20 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a  ns a new row of.
20920 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20930 20 20 20 20 20 20 20 72 65 73 75 6c 74 73 20 65         results e
20940 61 63 68 20 74 69 6d 65 20 69 74 20 69 73 20 69  ach time it is i
20950 6e 76 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e 74  nvoked.  The ent
20960 72 79 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20  ry point.**     
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20980 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  of the co-routin
20990 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72  e is stored in r
209a0 65 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69  egister pDest->i
209b0 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  SDParm..**.**   
209c0 20 20 53 52 54 5f 45 78 69 73 74 73 20 20 20 20    SRT_Exists    
209d0 20 20 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d    Store a 1 in m
209e0 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74  emory cell pDest
209f0 2d 3e 69 53 44 50 61 72 6d 20 69 66 20 74 68 65  ->iSDParm if the
20a00 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20   result.**      
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
20a20 65 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e  et is not empty.
20a30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44  .**.**     SRT_D
20a40 69 73 63 61 72 64 20 20 20 20 20 54 68 72 6f 77  iscard     Throw
20a50 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 77 61   the results awa
20a60 79 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  y.  This is used
20a70 20 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20   by SELECT.**   
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a90 20 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74    statements wit
20aa0 68 69 6e 20 74 72 69 67 67 65 72 73 20 77 68 6f  hin triggers who
20ab0 73 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20  se only purpose 
20ac0 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  is.**           
20ad0 20 20 20 20 20 20 20 20 20 20 74 68 65 20 73 69            the si
20ae0 64 65 2d 65 66 66 65 63 74 73 20 6f 66 20 66 75  de-effects of fu
20af0 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  nctions..**.** T
20b00 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
20b10 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
20b20 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
20b30 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
20b40 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
20b50 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
20b60 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
20b70 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
20b80 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
20b90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20ba0 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
20bb0 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
20bc0 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
20bd0 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
20be0 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
20bf0 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74   do that..*/.int
20c00 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
20c10 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
20c20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20c30 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
20c40 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
20c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20c60 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
20c70 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
20c80 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
20c90 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57  *pDest      /* W
20ca0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
20cb0 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  he query results
20cc0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
20cd0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
20ce0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
20cf0 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
20d00 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
20d10 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69  Return from sqli
20d20 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
20d30 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
20d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20d50 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
20d60 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
20d70 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
20d80 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20  sAgg;           
20d90 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
20da0 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
20db0 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
20dc0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
20dd0 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
20de0 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
20df0 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
20e00 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
20e10 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
20e20 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
20e30 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
20e40 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
20e50 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
20e60 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
20e70 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
20e80 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20  pOrderBy;    /* 
20e90 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
20ea0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
20eb0 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
20ec0 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
20ed0 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
20ee0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
20ef0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
20f00 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
20f10 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
20f20 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
20f30 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73  L */.  int isDis
20f40 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
20f50 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
20f60 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
20f70 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
20f80 74 20 64 69 73 74 69 6e 63 74 54 61 62 3b 20 20  t distinctTab;  
20f90 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
20fa0 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
20fb0 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69  tinct set */.  i
20fc0 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
20fd0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
20fe0 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
20ff0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
21000 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64   int addrSortInd
21010 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  ex;     /* Addre
21020 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e  ss of an OP_Open
21030 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
21040 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
21050 64 64 72 44 69 73 74 69 6e 63 74 49 6e 64 65 78  ddrDistinctIndex
21060 3b 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20  ; /* Address of 
21070 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  an OP_OpenEpheme
21080 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
21090 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
210a0 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
210b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
210c0 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
210d0 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
210e0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
210f0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
21100 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
21110 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
21120 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
21130 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
21140 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23  connection */..#
21150 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21160 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
21170 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
21180 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  d = pParse->iSel
21190 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d  ectId;.  pParse-
211a0 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  >iSelectId = pPa
211b0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
211c0 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Id++;.#endif..  
211d0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
211e0 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
211f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
21200 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
21210 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
21220 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
21230 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
21240 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
21250 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
21260 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
21270 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
21280 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
21290 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  ;..  if( Ignorab
212a0 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
212b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
212c0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
212d0 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
212e0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
212f0 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
21300 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
21310 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
21320 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
21330 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20 2f 2a  Discard);.    /*
21340 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b   If ORDER BY mak
21350 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
21360 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74   in the output t
21370 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73  hen neither does
21380 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54  .    ** DISTINCT
21390 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65   so it can be re
213a0 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20  moved too. */.  
213b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
213c0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
213d0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
213e0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
213f0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26     p->selFlags &
21400 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a  = ~SF_Distinct;.
21410 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    }.  sqlite3Sel
21420 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
21430 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65 72 42  p, 0);.  pOrderB
21440 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
21450 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
21460 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
21470 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
21480 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
21490 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
214a0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
214b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
214c0 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65    isAgg = (p->se
214d0 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
214e0 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73  egate)!=0;.  ass
214f0 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
21500 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  ;..  /* Begin ge
21510 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
21520 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
21530 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
21540 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
21550 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
21560 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67  .  /* If writing
21570 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65   to memory or ge
21580 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20  nerating a set. 
21590 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   ** only a singl
215a0 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20  e column may be 
215b0 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66  output..  */.#if
215c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
215d0 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20  _SUBQUERY.  if( 
215e0 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
215f0 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70  umnSelectError(p
21600 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45  Parse, pDest, pE
21610 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
21620 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
21630 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  end;.  }.#endif.
21640 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
21650 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
21660 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
21670 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
21680 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
21690 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
216a0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
216b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
216c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e  .  for(i=0; !p->
216d0 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62  pPrior && i<pTab
216e0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
216f0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
21700 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
21710 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
21720 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65  i];.    SelectDe
21730 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c  st dest;.    Sel
21740 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65  ect *pSub = pIte
21750 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
21760 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20  int isAggSub;.. 
21770 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29     if( pSub==0 )
21780 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
21790 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  f( pItem->addrFi
217a0 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20 73  llSub ){.      s
217b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
217c0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
217d0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
217e0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
217f0 75 62 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  ub);.      conti
21800 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
21810 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72  /* Increment Par
21820 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68  se.nHeight by th
21830 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20  e height of the 
21840 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69  largest expressi
21850 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72  on.    ** tree r
21860 65 66 65 72 65 64 20 74 6f 20 62 79 20 74 68 69  efered to by thi
21870 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65  s, the parent se
21880 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20  lect. The child 
21890 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61  select.    ** ma
218a0 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73  y contain expres
218b0 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74  sion trees of at
218c0 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51   most.    ** (SQ
218d0 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
218e0 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68  PTH-Parse.nHeigh
218f0 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20  t) height. This 
21900 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20  is a bit.    ** 
21910 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76  more conservativ
21920 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  e than necessary
21930 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65  , but much easie
21940 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67  r than enforcing
21950 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74  .    ** an exact
21960 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   limit..    */. 
21970 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
21980 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht += sqlite3Sel
21990 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
219a0 3b 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20  ;..    isAggSub 
219b0 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  = (pSub->selFlag
219c0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
219d0 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c  )!=0;.    if( fl
219e0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
219f0 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
21a00 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a  g, isAggSub) ){.
21a10 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75        /* This su
21a20 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
21a30 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20  sorbed into its 
21a40 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
21a50 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b   if( isAggSub ){
21a60 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d  .        isAgg =
21a70 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73   1;.        p->s
21a80 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
21a90 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d  gregate;.      }
21aa0 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
21ab0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21ac0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
21ad0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
21ae0 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d  ll fill an ephem
21af0 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a  eral table with.
21b00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e        ** the con
21b10 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62  tent of this sub
21b20 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61  query.  pItem->a
21b30 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20  ddrFillSub will 
21b40 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  point.      ** t
21b50 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  o the address of
21b60 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73   the generated s
21b70 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65  ubroutine.  pIte
21b80 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20  m->regReturn.   
21b90 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73     ** is a regis
21ba0 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ter allocated to
21bb0 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75   hold the subrou
21bc0 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72  tine return addr
21bd0 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ess.      */.   
21be0 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a     int topAddr;.
21bf0 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64        int onceAd
21c00 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
21c10 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20  t retAddr;.     
21c20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
21c30 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29  addrFillSub==0 )
21c40 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
21c50 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
21c60 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
21c70 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74   topAddr = sqlit
21c80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21c90 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
21ca0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
21cb0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
21cc0 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70  ddrFillSub = top
21cd0 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 56 64  Addr+1;.      Vd
21ce0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
21cf0 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 25  , "materialize %
21d00 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
21d10 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
21d20 69 66 28 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72  if( pItem->isCor
21d30 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20  related==0 ){.  
21d40 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
21d50 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 20 63  subquery is no c
21d60 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66  orrelated and if
21d70 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69   we are not insi
21d80 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  de of.        **
21d90 20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e   a trigger, then
21da0 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   we only need to
21db0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c   compute the val
21dc0 75 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ue of the subque
21dd0 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  ry.        ** on
21de0 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f  ce. */.        o
21df0 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65  nceAddr = sqlite
21e00 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
21e10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21e20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
21e30 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
21e40 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
21e50 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
21e60 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
21e70 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c  eger(pItem->iSel
21e80 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73  ectId, (u8)pPars
21e90 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
21ea0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21eb0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
21ec0 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
21ed0 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
21ee0 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67  nRowEst = (unsig
21ef0 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63  ned)pSub->nSelec
21f00 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20  tRow;.      if( 
21f10 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74  onceAddr ) sqlit
21f20 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
21f30 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20  , onceAddr);.   
21f40 20 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c     retAddr = sql
21f50 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
21f60 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74  , OP_Return, pIt
21f70 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
21f80 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
21f90 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20  t((v, "end %s", 
21fa0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
21fb0 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
21fc0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
21fd0 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41  v, topAddr, retA
21fe0 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ddr);.      sqli
21ff0 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
22000 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
22010 20 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70 50    }.    if( /*pP
22020 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20  arse->nErr ||*/ 
22030 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
22040 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
22050 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
22060 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
22070 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53  ight -= sqlite3S
22080 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
22090 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  p);.    pTabList
220a0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
220b0 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
220c0 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
220d0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
220e0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
220f0 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
22100 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65   = p->pEList;.#e
22110 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20  ndif.  pWhere = 
22120 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
22130 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
22140 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
22150 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69   p->pHaving;.  i
22160 73 44 69 73 74 69 6e 63 74 20 3d 20 28 70 2d 3e  sDistinct = (p->
22170 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
22180 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66  stinct)!=0;..#if
22190 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
221a0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
221b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
221c0 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65  s are a sequence
221d0 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20   of queries, do 
221e0 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73  the earlier ones
221f0 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69   first..  */.  i
22200 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
22210 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68      if( p->pRigh
22220 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  tmost==0 ){.    
22230 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c    Select *pLoop,
22240 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20   *pRight = 0;.  
22250 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
22260 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c  .      int mxSel
22270 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ect;.      for(p
22280 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
22290 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
222a0 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20  or, cnt++){.    
222b0 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68      pLoop->pRigh
222c0 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  tmost = p;.     
222d0 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20     pLoop->pNext 
222e0 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
222f0 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70    pRight = pLoop
22300 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22310 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61  mxSelect = db->a
22320 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
22330 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
22340 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d  CT];.      if( m
22350 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d  xSelect && cnt>m
22360 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  xSelect ){.     
22370 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
22380 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
22390 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f  many terms in co
223a0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b  mpound SELECT");
223b0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65  .        goto se
223c0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
223d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  }.    }.    rc =
223e0 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61   multiSelect(pPa
223f0 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a  rse, p, pDest);.
22400 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
22410 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53  teger(pParse->iS
22420 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72  electId, iRestor
22430 65 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  eSelectId);.    
22440 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
22450 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
22460 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47  here is both a G
22470 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f  ROUP BY and an O
22480 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
22490 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 2a 2a  nd they are.  **
224a0 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
224b0 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44   disable the ORD
224c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 69 6e  ER BY clause sin
224d0 63 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 0a  ce the GROUP BY.
224e0 20 20 2a 2a 20 77 69 6c 6c 20 63 61 75 73 65 20    ** will cause 
224f0 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65  elements to come
22500 20 6f 75 74 20 69 6e 20 74 68 65 20 63 6f 72 72   out in the corr
22510 65 63 74 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ect order.  This
22520 20 69 73 0a 20 20 2a 2a 20 61 6e 20 6f 70 74 69   is.  ** an opti
22530 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63  mization - the c
22540 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68  orrect answer sh
22550 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61  ould result rega
22560 72 64 6c 65 73 73 2e 0a 20 20 2a 2a 20 55 73 65  rdless..  ** Use
22570 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75   the SQLITE_Grou
22580 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69  pByOrder flag wi
22590 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  th SQLITE_TESTCT
225a0 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 0a 20 20 2a  RL_OPTIMIZER.  *
225b0 2a 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 69  * to disable thi
225c0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  s optimization f
225d0 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
225e0 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ses..  */.  if( 
225f0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
22600 6f 6d 70 61 72 65 28 70 2d 3e 70 47 72 6f 75 70  ompare(p->pGroup
22610 42 79 2c 20 70 4f 72 64 65 72 42 79 29 3d 3d 30  By, pOrderBy)==0
22620 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 64 62  .         && (db
22630 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
22640 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 3d 3d  _GroupByOrder)==
22650 30 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42  0 ){.    pOrderB
22660 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  y = 0;.  }..  /*
22670 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
22680 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61   DISTINCT with a
22690 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69  n ORDER BY but i
226a0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
226b0 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66  te, and .  ** if
226c0 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74   the select-list
226d0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
226e0 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73  the ORDER BY lis
226f0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65  t, then this que
22700 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72  ry.  ** can be r
22710 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52  ewritten as a GR
22720 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72  OUP BY. In other
22730 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20   words, this:.  
22740 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
22750 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20  CT DISTINCT xyz 
22760 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42  FROM ... ORDER B
22770 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Y xyz.  **.  ** 
22780 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
22790 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
227a0 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d   SELECT xyz FROM
227b0 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79   ... GROUP BY xy
227c0 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  z.  **.  ** The 
227d0 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70  second form is p
227e0 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69  referred as a si
227f0 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74  ngle index (or t
22800 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62  emp-table) may b
22810 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  e .  ** used for
22820 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20   both the ORDER 
22830 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  BY and DISTINCT 
22840 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f  processing. As o
22850 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20  riginally .  ** 
22860 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72  written the quer
22870 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d  y must use a tem
22880 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c  p-table for at l
22890 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
228a0 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61  ORDER .  ** BY a
228b0 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64  nd DISTINCT, and
228c0 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70   an index or sep
228d0 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65  arate temp-table
228e0 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a   for the other..
228f0 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73    */.  if( (p->s
22900 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
22910 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
22920 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
22930 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ct .   && sqlite
22940 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
22950 28 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 45  (pOrderBy, p->pE
22960 4c 69 73 74 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  List)==0.  ){.  
22970 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
22980 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
22990 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d     p->pGroupBy =
229a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
229b0 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
229c0 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72 6f 75  t, 0);.    pGrou
229d0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
229e0 79 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20  y;.    pOrderBy 
229f0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
22a00 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
22a10 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
22a20 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67  hen this sorting
22a30 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68  .  ** index migh
22a40 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75  t end up being u
22a50 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74  nused if the dat
22a60 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65  a can be .  ** e
22a70 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d  xtracted in pre-
22a80 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49  sorted order.  I
22a90 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
22aa0 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  se, then the.  *
22ab0 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  * OP_OpenEphemer
22ac0 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  al instruction w
22ad0 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74  ill be changed t
22ae0 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63  o an OP_Noop onc
22af0 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65  e.  ** we figure
22b00 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f   out that the so
22b10 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e  rting index is n
22b20 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20  ot needed.  The 
22b30 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20  addrSortIndex.  
22b40 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  ** variable is u
22b50 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74  sed to facilitat
22b60 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  e that change.. 
22b70 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
22b80 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
22b90 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
22ba0 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
22bb0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
22bc0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
22bd0 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  );.    pOrderBy-
22be0 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  >iECursor = pPar
22bf0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
22c00 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
22c10 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64  2] = addrSortInd
22c20 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  ex =.      sqlit
22c30 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
22c40 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
22c50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72               pOr
22c70 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
22c80 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
22c90 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  +2, 0,.         
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cb0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
22cc0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
22cd0 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b  NDOFF);.  }else{
22ce0 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64  .    addrSortInd
22cf0 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
22d00 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
22d10 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
22d20 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
22d30 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
22d40 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
22d50 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
22d60 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
22d70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
22d80 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
22d90 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e  hemeral, pDest->
22da0 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d  iSDParm, pEList-
22db0 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  >nExpr);.  }..  
22dc0 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74  /* Set the limit
22dd0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20  er..  */.  iEnd 
22de0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
22df0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e  eLabel(v);.  p->
22e00 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f  nSelectRow = (do
22e10 75 62 6c 65 29 4c 41 52 47 45 53 54 5f 49 4e 54  uble)LARGEST_INT
22e20 36 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d  64;.  computeLim
22e30 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
22e40 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20  se, p, iEnd);.  
22e50 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30  if( p->iLimit==0
22e60 20 26 26 20 61 64 64 72 53 6f 72 74 49 6e 64 65   && addrSortInde
22e70 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x>=0 ){.    sqli
22e80 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
22e90 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e  addrSortIndex)->
22ea0 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74  opcode = OP_Sort
22eb0 65 72 4f 70 65 6e 3b 0a 20 20 20 20 70 2d 3e 73  erOpen;.    p->s
22ec0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
22ed0 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20  eSorter;.  }..  
22ee0 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61  /* Open a virtua
22ef0 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
22f00 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
22f10 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
22f20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
22f30 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
22f40 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
22f50 66 6f 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74  fo;.    distinct
22f60 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
22f70 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ab++;.    pKeyIn
22f80 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
22f90 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
22fa0 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20   p->pEList);.   
22fb0 20 61 64 64 72 44 69 73 74 69 6e 63 74 49 6e 64   addrDistinctInd
22fc0 65 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ex = sqlite3Vdbe
22fd0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
22fe0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69 73 74  nEphemeral, dist
22ff0 69 6e 63 74 54 61 62 2c 0a 20 20 20 20 20 20 20  inctTab,.       
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23010 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
23020 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  , (char*)pKeyInf
23030 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
23040 4e 44 4f 46 46 29 3b 0a 20 20 20 20 73 71 6c 69  NDOFF);.    sqli
23050 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
23060 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  v, BTREE_UNORDER
23070 45 44 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ED);.  }else{.  
23080 20 20 64 69 73 74 69 6e 63 74 54 61 62 20 3d 20    distinctTab = 
23090 61 64 64 72 44 69 73 74 69 6e 63 74 49 6e 64 65  addrDistinctInde
230a0 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
230b0 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e 64 20  * Aggregate and 
230c0 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
230d0 65 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65  eries are handle
230e0 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f  d differently */
230f0 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
23100 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
23110 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44      ExprList *pD
23120 69 73 74 20 3d 20 28 69 73 44 69 73 74 69 6e 63  ist = (isDistinc
23130 74 20 3f 20 70 2d 3e 70 45 4c 69 73 74 20 3a 20  t ? p->pEList : 
23140 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69  0);..    /* Begi
23150 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
23160 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e  can. */.    pWIn
23170 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
23180 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
23190 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
231a0 20 26 70 4f 72 64 65 72 42 79 2c 20 70 44 69 73   &pOrderBy, pDis
231b0 74 2c 20 30 2c 30 29 3b 0a 20 20 20 20 69 66 28  t, 0,0);.    if(
231c0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
231d0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
231e0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 52    if( pWInfo->nR
231f0 6f 77 4f 75 74 20 3c 20 70 2d 3e 6e 53 65 6c 65  owOut < p->nSele
23200 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
23210 63 74 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d 3e  ctRow = pWInfo->
23220 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 20 20 2f 2a  nRowOut;..    /*
23230 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
23240 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
23250 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
23260 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
23270 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
23280 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
23290 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
232a0 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
232b0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
232c0 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
232d0 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
232e0 20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e    if( addrSortIn
232f0 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72  dex>=0 && pOrder
23300 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
23310 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
23320 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
23330 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  rtIndex);.      
23340 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
23350 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  2] = -1;.    }..
23360 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
23370 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  eDistinct ){.   
23380 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20     VdbeOp *pOp; 
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
233a0 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75  * No longer requ
233b0 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65 72  ired OpenEphemer
233c0 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20  al instr. */.   
233d0 20 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28    .      assert(
233e0 20 61 64 64 72 44 69 73 74 69 6e 63 74 49 6e 64   addrDistinctInd
233f0 65 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ex>=0 );.      s
23400 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
23410 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 44 69  ToNoop(v, addrDi
23420 73 74 69 6e 63 74 49 6e 64 65 78 29 3b 0a 20 20  stinctIndex);.  
23430 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
23440 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64  3VdbeGetOp(v, ad
23450 64 72 44 69 73 74 69 6e 63 74 49 6e 64 65 78 29  drDistinctIndex)
23460 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
23470 20 69 73 44 69 73 74 69 6e 63 74 20 29 3b 0a 20   isDistinct );. 
23480 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49       assert( pWI
23490 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
234a0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
234b0 52 44 45 52 45 44 20 0a 20 20 20 20 20 20 20 20  RDERED .        
234c0 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 44     || pWInfo->eD
234d0 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44  istinct==WHERE_D
234e0 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 20 0a  ISTINCT_UNIQUE .
234f0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 64        );.      d
23500 69 73 74 69 6e 63 74 54 61 62 20 3d 20 2d 31 3b  istinctTab = -1;
23510 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
23520 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48  o->eDistinct==WH
23530 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
23540 45 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ERED ){.        
23550 69 6e 74 20 69 4a 75 6d 70 3b 0a 20 20 20 20 20  int iJump;.     
23560 20 20 20 69 6e 74 20 69 45 78 70 72 3b 0a 20 20     int iExpr;.  
23570 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20        int nExpr 
23580 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
23590 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 42 61  .        int iBa
235a0 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
235b0 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  m+1;.        int
235c0 20 69 42 61 73 65 32 20 3d 20 69 42 61 73 65 20   iBase2 = iBase 
235d0 2b 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  + nExpr;.       
235e0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
235f0 20 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2a   (pEList->nExpr*
23600 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  2);..        /* 
23610 43 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  Change the OP_Op
23620 65 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65  enEphemeral code
23630 64 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20  d earlier to an 
23640 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20  OP_Null.        
23650 2a 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f  ** sets the MEM_
23660 43 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74  Cleared bit on t
23670 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
23680 72 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  r of the.       
23690 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c   ** previous val
236a0 75 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  ue.  This will c
236b0 61 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62  ause the OP_Ne b
236c0 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20  elow to always. 
236d0 20 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f         ** fail o
236e0 6e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  n the first iter
236f0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
23700 70 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69  p even if the fi
23710 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  rst.        ** r
23720 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e  ow is all NULLs.
23730 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
23740 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
23750 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20  = OP_Null;.     
23760 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a     pOp->p1 = 1;.
23770 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
23780 3d 20 69 42 61 73 65 32 3b 0a 0a 20 20 20 20 20  = iBase2;..     
23790 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
237a0 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
237b0 65 2c 20 70 45 4c 69 73 74 2c 20 69 42 61 73 65  e, pEList, iBase
237c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 4a  , 1);.        iJ
237d0 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ump = sqlite3Vdb
237e0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
237f0 2b 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  + pEList->nExpr;
23800 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 45 78  .        for(iEx
23810 70 72 3d 30 3b 20 69 45 78 70 72 3c 6e 45 78 70  pr=0; iExpr<nExp
23820 72 3b 20 69 45 78 70 72 2b 2b 29 7b 0a 20 20 20  r; iExpr++){.   
23830 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
23840 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
23850 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
23860 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 45 78  e, pEList->a[iEx
23870 70 72 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  pr].pExpr);.    
23880 20 20 20 20 20 20 69 66 28 20 69 45 78 70 72 3c        if( iExpr<
23890 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20  nExpr-1 ){.     
238a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
238b0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
238c0 65 2c 20 69 42 61 73 65 2b 69 45 78 70 72 2c 20  e, iBase+iExpr, 
238d0 69 4a 75 6d 70 2c 20 69 42 61 73 65 32 2b 69 45  iJump, iBase2+iE
238e0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
238f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
23910 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 69  dOp3(v, OP_Eq, i
23920 42 61 73 65 2b 69 45 78 70 72 2c 20 70 57 49 6e  Base+iExpr, pWIn
23930 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 0a 20  fo->iContinue,. 
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 69 42 61               iBa
23960 73 65 32 2b 69 45 78 70 72 29 3b 0a 20 20 20 20  se2+iExpr);.    
23970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23980 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
23990 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f  ngeP4(v, -1, (co
239a0 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c  nst char *)pColl
239b0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
239c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
239d0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
239e0 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
239f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23a00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23a10 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
23a20 28 76 29 3d 3d 69 4a 75 6d 70 20 29 3b 0a 20 20  (v)==iJump );.  
23a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23a40 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 6f  eAddOp3(v, OP_Mo
23a50 76 65 2c 20 69 42 61 73 65 2c 20 69 42 61 73 65  ve, iBase, iBase
23a60 32 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  2, pEList->nExpr
23a70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
23a80 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
23a90 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20   standard inner 
23aa0 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c  loop. */.    sel
23ab0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
23ac0 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20  rse, p, pEList, 
23ad0 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20  0, 0, pOrderBy, 
23ae0 64 69 73 74 69 6e 63 74 54 61 62 2c 20 70 44 65  distinctTab, pDe
23af0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
23b00 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
23b10 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66  iContinue, pWInf
23b20 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 20  o->iBreak);..   
23b30 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
23b40 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
23b50 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
23b60 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
23b70 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
23b80 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
23b90 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  processing for a
23ba0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
23bb0 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
23bc0 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
23bd0 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
23be0 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
23bf0 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
23c00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
23c10 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
23c20 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
23c30 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
23c40 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
23c50 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
23c60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
23c70 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
23c80 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
23c90 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
23ca0 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
23cb0 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
23cc0 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
23cd0 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
23ce0 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
23d00 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
23d10 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
23d20 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator has been. 
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
23d50 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
23d60 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
23d70 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
23d80 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
23d90 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
23da0 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
23db0 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
23dc0 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
23dd0 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
23de0 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  BY order */.    
23df0 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20  int addrEnd;    
23e00 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72      /* End of pr
23e10 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69  ocessing for thi
23e20 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  s SELECT */.    
23e30 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30  int sortPTab = 0
23e40 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62  ;   /* Pseudotab
23e50 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64  le used to decod
23e60 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74  e sorting result
23e70 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  s */.    int sor
23e80 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tOut = 0;    /* 
23e90 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  Output register 
23ea0 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
23eb0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  */..    /* Remov
23ec0 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c  e any and all al
23ed0 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68  iases between th
23ee0 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
23ef0 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55   the.    ** GROU
23f00 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  P BY clause..   
23f10 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
23f20 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
23f30 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  t k;            
23f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
23f50 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
23f60 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
23f70 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
23f80 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  ;  /* For loopin
23f90 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f  g over expressio
23fa0 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a  n in a list */..
23fb0 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70        for(k=p->p
23fc0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  EList->nExpr, pI
23fd0 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  tem=p->pEList->a
23fe0 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65  ; k>0; k--, pIte
23ff0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  m++){.        pI
24000 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b  tem->iAlias = 0;
24010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
24020 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
24030 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
24040 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
24050 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
24060 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69       pItem->iAli
24070 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
24080 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
24090 6c 65 63 74 52 6f 77 3e 28 64 6f 75 62 6c 65 29  lectRow>(double)
240a0 31 30 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  100 ) p->nSelect
240b0 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 31 30  Row = (double)10
240c0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
240d0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
240e0 77 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20  w = (double)1;. 
240f0 20 20 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43     }.. .    /* C
24100 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f  reate a label to
24110 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65   jump to when we
24120 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74   want to abort t
24130 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  he query */.    
24140 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
24150 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
24160 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
24170 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  rt TK_COLUMN nod
24180 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  es into TK_AGG_C
24190 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65  OLUMN and make e
241a0 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a  ntries in.    **
241b0 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c   sAggInfo for al
241c0 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  l TK_AGG_FUNCTIO
241d0 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65  N nodes in expre
241e0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
241f0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
24200 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
24210 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
24220 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
24230 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
24240 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
24250 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
24260 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41  List;.    sNC.pA
24270 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e  ggInfo = &sAggIn
24280 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  fo;.    sAggInfo
24290 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20  .nSortingColumn 
242a0 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72  = pGroupBy ? pGr
242b0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a  oupBy->nExpr+1 :
242c0 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
242d0 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
242e0 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
242f0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
24300 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
24310 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
24320 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
24330 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29  (&sNC, pOrderBy)
24340 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
24350 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
24360 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
24370 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48  regates(&sNC, pH
24380 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20  aving);.    }.  
24390 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
243a0 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
243b0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
243c0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
243d0 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
243e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
243f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
24400 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
24410 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ].pExpr, EP_xIsS
24420 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
24430 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  sNC.ncFlags |= N
24440 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
24450 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
24460 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
24470 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
24480 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  c[i].pExpr->x.pL
24490 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  ist);.      sNC.
244a0 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49  ncFlags &= ~NC_I
244b0 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a  nAggFunc;.    }.
244c0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
244d0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
244e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20  select_end;..   
244f0 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66   /* Processing f
24500 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69  or aggregates wi
24510 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76  th GROUP BY is v
24520 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e  ery different an
24530 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f  d.    ** much mo
24540 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20  re complex than 
24550 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f  aggregates witho
24560 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20  ut a GROUP BY.. 
24570 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
24580 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
24590 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
245a0 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e  o;  /* Keying in
245b0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
245c0 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73  e group by claus
245d0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  e */.      int j
245e0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
245f0 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69  * A-vs-B compari
24600 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20  sion jump */.   
24610 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75     int addrOutpu
24620 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20  tRow;  /* Start 
24630 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  of subroutine th
24640 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73  at outputs a res
24650 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ult row */.     
24660 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f   int regOutputRo
24670 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  w;   /* Return a
24680 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
24690 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f  for output subro
246a0 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  utine */.      i
246b0 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b  nt addrSetAbort;
246c0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
246d0 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
246e0 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  urn */.      int
246f0 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
24700 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
24710 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
24720 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
24730 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50  ngIdx; /* The OP
24740 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66  _OpenEphemeral f
24750 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  or the sorting i
24760 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
24770 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
24780 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
24790 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
247a0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
247b0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
247c0 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  set;       /* Re
247d0 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
247e0 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20  ister for reset 
247f0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  subroutine */.. 
24800 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
24810 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
24820 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
24830 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
24840 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
24850 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
24860 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
24870 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
24880 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
24890 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
248a0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
248b0 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
248c0 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  OP_SorterOpen in
248d0 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20  struction.      
248e0 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  ** will be conve
248f0 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70  rted into a Noop
24900 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  .  .      */.   
24910 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
24920 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d  ingIdx = pParse-
24930 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
24940 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
24950 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
24960 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b  arse, pGroupBy);
24970 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
24980 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
24990 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
249a0 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20  SorterOpen, .   
249b0 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
249c0 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67  sortingIdx, sAgg
249d0 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
249e0 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  umn, .          
249f0 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  0, (char*)pKeyIn
24a00 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
24a10 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20  ANDOFF);..      
24a20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
24a30 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
24a40 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
24a50 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
24a60 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
24a70 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
24a80 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
24a90 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
24aa0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
24ab0 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75  ;.      regOutpu
24ac0 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tRow = ++pParse-
24ad0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
24ae0 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
24af0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
24b00 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52  l(v);.      regR
24b10 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  eset = ++pParse-
24b20 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
24b30 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33  rReset = sqlite3
24b40 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
24b50 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20  ;.      iAMem = 
24b60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
24b70 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
24b80 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
24b90 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
24ba0 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
24bb0 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
24bc0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
24bd0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
24be0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24bf0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
24c00 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74  teger, 0, iAbort
24c10 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
24c20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c  eComment((v, "cl
24c30 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29  ear abort flag")
24c40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24c50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24c60 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73  _Integer, 0, iUs
24c70 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
24c80 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
24c90 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61  ndicate accumula
24ca0 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20  tor empty"));.  
24cb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24cc0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
24cd0 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65  , 0, iAMem, iAMe
24ce0 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  m+pGroupBy->nExp
24cf0 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r-1);..      /* 
24d00 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61  Begin a loop tha
24d10 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61  t will extract a
24d20 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69  ll source rows i
24d30 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
24d40 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
24d50 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77  might involve tw
24d60 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73  o separate loops
24d70 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74   with an OP_Sort
24d80 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a   in between, or.
24d90 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
24da0 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f  t be a single lo
24db0 6f 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20  op that uses an 
24dc0 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74  index to extract
24dd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20   information.   
24de0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67     ** in the rig
24df0 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69  ht order to begi
24e00 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f  n with..      */
24e10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
24e20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
24e30 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20  osub, regReset, 
24e40 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
24e50 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
24e60 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
24e70 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
24e80 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70 42 79  Where, &pGroupBy
24e90 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
24ea0 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
24eb0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
24ec0 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72  d;.      if( pGr
24ed0 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
24ee0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d      /* The optim
24ef0 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20  izer is able to 
24f00 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
24f10 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73  group by order s
24f20 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20  o.        ** we 
24f30 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73  do not have to s
24f40 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65  ort.  The OP_Ope
24f50 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65  nEphemeral table
24f60 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
24f70 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61   ** cancelled la
24f80 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73  ter because we s
24f90 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65  till need to use
24fa0 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20   the pKeyInfo.  
24fb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
24fc0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
24fd0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
24fe0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30   groupBySort = 0
24ff0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25000 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61         /* Rows a
25010 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e  re coming out in
25020 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72   undetermined or
25030 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  der.  We have to
25040 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a   push.        **
25050 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61   each row into a
25060 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20   sorting index, 
25070 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69  terminate the fi
25080 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20  rst loop,.      
25090 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f    ** then loop o
250a0 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  ver the sorting 
250b0 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74  index in order t
250c0 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74  o get the output
250d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73  .        ** in s
250e0 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20  orted order.    
250f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
25100 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20  nt regBase;.    
25110 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72      int regRecor
25120 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
25130 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Col;.        int
25140 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20   nGroupBy;..    
25150 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
25160 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20  able(pParse, .  
25170 20 20 20 20 20 20 20 20 20 20 69 73 44 69 73 74            isDist
25180 69 6e 63 74 20 26 26 20 21 28 70 2d 3e 73 65 6c  inct && !(p->sel
25190 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63  Flags&SF_Distinc
251a0 74 29 3f 22 44 49 53 54 49 4e 43 54 22 3a 22 47  t)?"DISTINCT":"G
251b0 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20  ROUP BY");..    
251c0 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
251d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72  = 1;.        nGr
251e0 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
251f0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
25200 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79   nCol = nGroupBy
25210 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20   + 1;.        j 
25220 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20  = nGroupBy+1;.  
25230 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
25240 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
25250 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
25260 20 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e     if( sAggInfo.
25270 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43  aCol[i].iSorterC
25280 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
25290 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a          nCol++;.
252a0 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
252b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
252c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
252d0 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33  egBase = sqlite3
252e0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
252f0 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  rse, nCol);.    
25300 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25310 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
25320 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
25330 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
25340 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
25350 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29  pBy, regBase, 0)
25360 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
25370 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
25380 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67  P_Sequence, sAgg
25390 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
253a0 72 65 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79  regBase+nGroupBy
253b0 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  );.        j = n
253c0 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20  GroupBy+1;.     
253d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
253e0 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
253f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
25400 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
25410 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67  ol *pCol = &sAgg
25420 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  Info.aCol[i];.  
25430 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
25440 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ->iSorterColumn>
25450 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
25460 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72    int r1 = j + r
25470 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
25480 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20      int r2;..   
25490 20 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71           r2 = sq
254a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
254b0 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a  Column(pParse, .
254c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
254e0 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d  Col->pTab, pCol-
254f0 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e  >iColumn, pCol->
25500 69 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a  iTable, r1, 0);.
25510 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25520 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20  r1!=r2 ){.      
25530 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
25540 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
25550 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a  SCopy, r2, r1);.
25560 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
25570 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
25580 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25590 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
255a0 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
255b0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
255c0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
255d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
255e0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
255f0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72  regBase, nCol, r
25600 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
25610 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25620 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
25630 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66  rInsert, sAggInf
25640 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65  o.sortingIdx, re
25650 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
25660 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
25670 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
25680 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
25690 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
256a0 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
256b0 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
256c0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
256d0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
256e0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  fo);.        sAg
256f0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
25700 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20  PTab = sortPTab 
25710 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
25720 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75  ;.        sortOu
25730 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
25740 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
25750 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
25760 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
25770 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50  penPseudo, sortP
25780 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43  Tab, sortOut, nC
25790 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
257a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
257b0 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
257c0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
257d0 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a  gIdx, addrEnd);.
257e0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
257f0 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42  ent((v, "GROUP B
25800 59 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20  Y sort"));.     
25810 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
25820 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
25830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
25840 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
25850 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rse);.      }.. 
25860 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
25870 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
25880 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20  UP BY terms and 
25890 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c  store in b0, b1,
258a0 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20   b2....      ** 
258b0 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f  (b0 is memory lo
258c0 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20  cation iBMem+0, 
258d0 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61  b1 is iBMem+1, a
258e0 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20  nd so forth).   
258f0 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61     ** Then compa
25900 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  re the current G
25910 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67  ROUP BY terms ag
25920 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20  ainst the GROUP 
25930 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a  BY terms.      *
25940 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  * from the previ
25950 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  ous row currentl
25960 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20  y stored in a0, 
25970 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20  a1, a2....      
25980 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  */.      addrTop
25990 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
259a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
259b0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
259c0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
259d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
259e0 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
259f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25a00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
25a10 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41  P_SorterData, sA
25a20 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
25a30 78 2c 20 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20  x, sortOut);.   
25a40 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
25a50 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
25a60 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
25a70 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
25a80 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
25a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25aa0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
25ab0 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69  , sortPTab, j, i
25ac0 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
25ad0 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 73 71     if( j==0 ) sq
25ae0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
25af0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41  5(v, OPFLAG_CLEA
25b00 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20  RCACHE);.       
25b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25b20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
25b30 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
25b40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
25b50 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
25b60 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
25b70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  r, iBMem+j);.   
25b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25b90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25ba0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
25bb0 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d  pare, iAMem, iBM
25bc0 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
25bd0 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
25be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
25bf0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
25c00 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
25c10 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
25c20 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
25c30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25c40 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
25c50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20  _Jump, j1+1, 0, 
25c60 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  j1+1);..      /*
25c70 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
25c80 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65  hat runs wheneve
25c90 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
25ca0 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a  hanges..      **
25cb0 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   Changes in the 
25cc0 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74  GROUP BY are det
25cd0 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65  ected by the pre
25ce0 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20  vious code.     
25cf0 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74   ** block.  If t
25d00 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61  here were no cha
25d10 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b  nges, this block
25d20 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   is skipped..   
25d30 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
25d40 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20  his code copies 
25d50 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79  current group by
25d60 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c   terms in b0,b1,
25d70 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  b2,....      ** 
25d80 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32  over to a0,a1,a2
25d90 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73  .  It then calls
25da0 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
25db0 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
25dc0 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61  and resets the a
25dd0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
25de0 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69  ator registers i
25df0 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20  n preparation.  
25e00 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e      ** for the n
25e10 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74  ext GROUP BY bat
25e20 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
25e30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
25e40 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  deMove(pParse, i
25e50 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72  BMem, iAMem, pGr
25e60 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20  oupBy->nExpr);. 
25e70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25e80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
25e90 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
25ea0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
25eb0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
25ec0 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
25ed0 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20  one row"));.    
25ee0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25ef0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
25f00 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64   iAbortFlag, add
25f10 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62  rEnd);.      Vdb
25f20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68  eComment((v, "ch
25f30 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29  eck abort flag")
25f40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25f50 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
25f60 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
25f70 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
25f80 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
25f90 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d  (v, "reset accum
25fa0 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
25fb0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
25fc0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
25fd0 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20  lators based on 
25fe0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20  the content of. 
25ff0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72       ** the curr
26000 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f  ent row.      */
26010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26020 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
26030 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41  );.      updateA
26040 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
26050 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
26060 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26070 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
26080 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61  eger, 1, iUseFla
26090 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
260a0 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
260b0 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75  ate data in accu
260c0 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
260d0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
260e0 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20   loop.      */. 
260f0 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
26100 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
26110 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26120 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
26130 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  xt, sAggInfo.sor
26140 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70  tingIdx, addrTop
26150 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d  OfLoop);.      }
26160 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
26170 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
26180 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
26190 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
261a0 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
261b0 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20  rtingIdx);.     
261c0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74   }..      /* Out
261d0 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f  put the final ro
261e0 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20  w of result.    
261f0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
26200 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
26210 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
26220 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
26230 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
26240 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
26250 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22  utput final row"
26260 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75  ));..      /* Ju
26270 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75 62 72  mp over the subr
26280 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f  outines.      */
26290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
262a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
262b0 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64 29  oto, 0, addrEnd)
262c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
262d0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
262e0 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
262f0 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
26300 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
26310 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75  ** set.  This su
26320 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c  broutine first l
26330 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65  ooks at the iUse
26340 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c  Flag.  If iUseFl
26350 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c  ag.      ** is l
26360 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
26370 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73  l to zero, the s
26380 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  ubroutine is a n
26390 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20  o-op.  If.      
263a0 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ** the processin
263b0 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  g calls for the 
263c0 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20  query to abort, 
263d0 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a  this subroutine.
263e0 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65        ** increme
263f0 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c  nts the iAbortFl
26400 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ag memory locati
26410 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  on before return
26420 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ing in.      ** 
26430 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20  order to signal 
26440 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62  the caller to ab
26450 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ort..      */.  
26460 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74      addrSetAbort
26470 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
26480 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
26490 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
264a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
264b0 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c  ger, 1, iAbortFl
264c0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
264d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20  omment((v, "set 
264e0 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
264f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26500 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
26510 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
26520 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  w);.      sqlite
26530 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
26540 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52  l(v, addrOutputR
26550 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  ow);.      addrO
26560 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
26570 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
26580 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
26590 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
265a0 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46   OP_IfPos, iUseF
265b0 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  lag, addrOutputR
265c0 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  ow+2);.      Vdb
265d0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72  eComment((v, "Gr
265e0 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
265f0 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69  erator entry poi
26600 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  nt"));.      sql
26610 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
26620 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
26630 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
26640 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
26650 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
26660 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
26670 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
26680 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
26690 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  ing, addrOutputR
266a0 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  ow+1, SQLITE_JUM
266b0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
266c0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
266d0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
266e0 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64  List, 0, 0, pOrd
266f0 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
26700 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
26710 69 6e 63 74 54 61 62 2c 20 70 44 65 73 74 2c 0a  inctTab, pDest,.
26720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26730 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
26740 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62  Row+1, addrSetAb
26750 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ort);.      sqli
26760 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
26770 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
26780 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
26790 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
267a0 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65   "end groupby re
267b0 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29  sult generator")
267c0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
267d0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
267e0 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73  ne that will res
267f0 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20  et the group-by 
26800 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20  accumulator.    
26810 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
26820 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
26830 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29  el(v, addrReset)
26840 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  ;.      resetAcc
26850 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
26860 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
26870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26880 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
26890 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20  n, regReset);.  
268a0 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64     .    } /* end
268b0 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65  if pGroupBy.  Be
268c0 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71 75  gin aggregate qu
268d0 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47 52  eries without GR
268e0 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65  OUP BY: */.    e
268f0 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72  lse {.      Expr
26900 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a  List *pDel = 0;.
26910 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26920 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20  MIT_BTREECOUNT. 
26930 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
26940 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61  ;.      if( (pTa
26950 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e  b = isSimpleCoun
26960 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29  t(p, &sAggInfo))
26970 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
26980 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75  * If isSimpleCou
26990 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20 70  nt() returns a p
269a0 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c  ointer to a Tabl
269b0 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  e structure, the
269c0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
269d0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
269e0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
269f0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
26a00 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f    **   SELECT co
26a10 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c  unt(*) FROM <tbl
26a20 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  >.        **.   
26a30 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68       ** where th
26a40 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
26a50 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72 65  e returned repre
26a60 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c  sents table <tbl
26a70 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  >..        **.  
26a80 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74        ** This st
26a90 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f  atement is so co
26aa0 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20  mmon that it is 
26ab0 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61  optimized specia
26ac0 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20  lly. The.       
26ad0 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73   ** OP_Count ins
26ae0 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63  truction is exec
26af0 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74  uted either on t
26b00 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20  he intkey table 
26b10 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
26b20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
26b30 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c  a for table <tbl
26b40 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69  > or on one of i
26b50 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20  ts indexes. It. 
26b60 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74         ** is bet
26b70 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20 74  ter to execute t
26b80 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65  he op on an inde
26b90 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61 72  x, as indexes ar
26ba0 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20  e almost.       
26bb0 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61   ** always sprea
26bc0 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61  d across less pa
26bd0 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20 63  ges than their c
26be0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
26bf0 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  les..        */.
26c00 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
26c10 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
26c20 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
26c30 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
26c40 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
26c50 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20   const int iCsr 
26c60 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
26c70 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ;     /* Cursor 
26c80 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a  to scan b-tree *
26c90 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
26ca0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26cc0 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
26cd0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b  ble */.        K
26ce0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
26cf0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
26d00 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66      /* Keyinfo f
26d10 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78  or scanned index
26d20 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
26d30 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20  x *pBest = 0;   
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d50 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66   /* Best index f
26d60 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ound so far */. 
26d70 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74         int iRoot
26d80 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20   = pTab->tnum;  
26d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26da0 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e  oot page of scan
26db0 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20  ned b-tree */.. 
26dc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
26dd0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
26de0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
26df0 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
26e00 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
26e10 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
26e20 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
26e30 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72  .        /* Sear
26e40 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ch for the index
26e50 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c 65   that has the le
26e60 61 73 74 20 61 6d 6f 75 6e 74 20 6f 66 20 63 6f  ast amount of co
26e70 6c 75 6d 6e 73 2e 20 49 66 0a 20 20 20 20 20 20  lumns. If.      
26e80 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 73 75    ** there is su
26e90 63 68 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e 64  ch an index, and
26ea0 20 69 74 20 68 61 73 20 6c 65 73 73 20 63 6f 6c   it has less col
26eb0 75 6d 6e 73 20 74 68 61 6e 20 74 68 65 20 74 61  umns than the ta
26ec0 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  ble.        ** d
26ed0 6f 65 73 2c 20 74 68 65 6e 20 77 65 20 63 61 6e  oes, then we can
26ee0 20 61 73 73 75 6d 65 20 74 68 61 74 20 69 74 20   assume that it 
26ef0 63 6f 6e 73 75 6d 65 73 20 6c 65 73 73 20 73 70  consumes less sp
26f00 61 63 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 0a  ace on disk and.
26f10 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20          ** will 
26f20 74 68 65 72 65 66 6f 72 65 20 62 65 20 63 68 65  therefore be che
26f30 61 70 65 72 20 74 6f 20 73 63 61 6e 20 74 6f 20  aper to scan to 
26f40 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 71 75  determine the qu
26f50 65 72 79 20 72 65 73 75 6c 74 2e 0a 20 20 20 20  ery result..    
26f60 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
26f70 61 73 65 20 73 65 74 20 69 52 6f 6f 74 20 74 6f  ase set iRoot to
26f80 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
26f90 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
26fa0 65 78 20 62 2d 74 72 65 65 0a 20 20 20 20 20 20  ex b-tree.      
26fb0 20 20 2a 2a 20 61 6e 64 20 70 4b 65 79 49 6e 66    ** and pKeyInf
26fc0 6f 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f  o to the KeyInfo
26fd0 20 73 74 72 75 63 74 75 72 65 20 72 65 71 75 69   structure requi
26fe0 72 65 64 20 74 6f 20 6e 61 76 69 67 61 74 65 20  red to navigate 
26ff0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
27000 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
27010 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31  .        ** (201
27020 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20  1-04-15) Do not 
27030 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f  do a full scan o
27040 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69  f an unordered i
27050 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ndex..        **
27060 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70  .        ** In p
27070 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79 49  ractice the KeyI
27080 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77 69  nfo structure wi
27090 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
270a0 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20  It is only .    
270b0 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f      ** passed to
270c0 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61   keep OP_OpenRea
270d0 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20  d happy..       
270e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
270f0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
27100 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
27110 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
27120 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
27130 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 20 26 26  bUnordered==0 &&
27140 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78   (!pBest || pIdx
27150 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 42 65 73 74 2d  ->nColumn<pBest-
27160 3e 6e 43 6f 6c 75 6d 6e 29 20 29 7b 0a 20 20 20  >nColumn) ){.   
27170 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d           pBest =
27180 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20   pIdx;.         
27190 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
271a0 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20 26       if( pBest &
271b0 26 20 70 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d 6e  & pBest->nColumn
271c0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
271d0 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d           iRoot =
271e0 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20   pBest->tnum;.  
271f0 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
27200 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
27210 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
27220 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Best);.        }
27230 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ..        /* Ope
27240 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  n a read-only cu
27250 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68  rsor, execute th
27260 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73  e OP_Count, clos
27270 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f  e the cursor. */
27280 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27290 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
272a0 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c  _OpenRead, iCsr,
272b0 20 69 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20   iRoot, iDb);.  
272c0 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
272d0 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
272e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
272f0 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
27300 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f   *)pKeyInfo, P4_
27310 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
27320 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27330 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27340 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e  ddOp2(v, OP_Coun
27350 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66  t, iCsr, sAggInf
27360 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29  o.aFunc[0].iMem)
27370 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
27380 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
27390 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a  P_Close, iCsr);.
273a0 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
273b0 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73  impleCount(pPars
273c0 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b  e, pTab, pBest);
273d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
273e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
273f0 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f  IT_BTREECOUNT */
27400 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
27410 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
27420 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65   query is of one
27430 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
27440 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20  g forms:.       
27450 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
27460 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46   SELECT min(x) F
27470 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20  ROM ....        
27480 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  **   SELECT max(
27490 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
274a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
274b0 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  * If it is, then
274c0 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e   ask the code in
274d0 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65   where.c to atte
274e0 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75  mpt to sort resu
274f0 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  lts.        ** a
27500 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
27510 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f  n "ORDER ON x" o
27520 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45  r "ORDER ON x DE
27530 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20  SC" clause. .   
27540 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65       ** If where
27550 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72  .c is able to pr
27560 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f  oduce results so
27570 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64  rted in this ord
27580 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  er, then.       
27590 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64   ** add vdbe cod
275a0 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
275b0 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  f the processing
275c0 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20   loop after the 
275d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73  .        ** firs
275e0 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e  t iteration (sin
275f0 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65  ce the first ite
27600 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
27610 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  op is .        *
27620 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
27630 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72  operate on the r
27640 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69  ow with the mini
27650 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a  mum or maximum .
27660 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
27670 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20   of x, the only 
27680 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20  row required).. 
27690 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
276a0 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66    ** A special f
276b0 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73  lag must be pass
276c0 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
276d0 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69  reBegin() to sli
276e0 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a  ghtly.        **
276f0 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 75   modify behaviou
27700 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  r as follows:.  
27710 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
27720 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71   **   + If the q
27730 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43  uery is a "SELEC
27740 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20  T min(x)", then 
27750 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62  the loop coded b
27760 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  y.        **    
27770 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20   where.c should 
27780 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72  not iterate over
27790 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68   any values with
277a0 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20   a NULL value.  
277b0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72        **     for
277c0 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20   x..        **. 
277d0 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68         **   + Th
277e0 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65  e optimizer code
277f0 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65   in where.c (the
27800 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69   thing that deci
27810 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20  des which.      
27820 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f    **     index o
27830 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65  r indices to use
27840 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61  ) should place a
27850 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72   different prior
27860 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20  ity on .        
27870 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e  **     satisfyin
27880 67 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27  g the 'ORDER BY'
27890 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20   clause than it 
278a0 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61  does in other ca
278b0 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ses..        ** 
278c0 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64      Refer to cod
278d0 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69  e and comments i
278e0 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65  n where.c for de
278f0 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  tails..        *
27900 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  /.        ExprLi
27910 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b  st *pMinMax = 0;
27920 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67  .        u8 flag
27930 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 70   = minMaxQuery(p
27940 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
27950 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
27960 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
27970 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 45 4c  sProperty(p->pEL
27980 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
27990 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
279a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e  ;.          pMin
279b0 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Max = sqlite3Exp
279c0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
279d0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
279e0 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 30 29 3b 0a  pr->x.pList,0);.
279f0 20 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d            pDel =
27a00 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20   pMinMax;.      
27a10 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20      if( pMinMax 
27a20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
27a30 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
27a40 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30      pMinMax->a[0
27a50 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c  ].sortOrder = fl
27a60 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag!=WHERE_ORDERB
27a70 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20  Y_MIN ?1:0;.    
27a80 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
27a90 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20  >a[0].pExpr->op 
27aa0 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
27ab0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27ac0 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a   }.  .        /*
27ad0 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20   This case runs 
27ae0 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  if the aggregate
27af0 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   has no GROUP BY
27b00 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20   clause.  The.  
27b10 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
27b20 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70  ing is much simp
27b30 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20  ler since there 
27b40 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
27b50 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   row.        ** 
27b60 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20  of output..     
27b70 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
27b80 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  setAccumulator(p
27b90 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
27ba0 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  );.        pWInf
27bb0 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
27bc0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
27bd0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
27be0 26 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c  &pMinMax,0,flag,
27bf0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
27c00 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  pWInfo==0 ){.   
27c10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
27c20 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
27c30 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20   pDel);.        
27c40 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
27c50 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
27c60 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
27c70 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
27c80 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
27c90 20 20 20 69 66 28 20 21 70 4d 69 6e 4d 61 78 20     if( !pMinMax 
27ca0 26 26 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  && flag ){.     
27cb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27cc0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
27cd0 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  o, 0, pWInfo->iB
27ce0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  reak);.         
27cf0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
27d00 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22   "%s() by index"
27d10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27d20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f    (flag==WHERE_O
27d30 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22  RDERBY_MIN?"min"
27d40 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20  :"max")));.     
27d50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
27d60 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
27d70 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69  nfo);.        fi
27d80 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
27d90 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
27da0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Info);.      }..
27db0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
27dc0 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
27dd0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
27de0 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
27df0 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55  drEnd, SQLITE_JU
27e00 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
27e10 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
27e20 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
27e30 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20  EList, 0, 0, 0, 
27e40 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
27e50 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
27e60 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45  , addrEnd, addrE
27e70 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nd);.      sqlit
27e80 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
27e90 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
27ea0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
27eb0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
27ec0 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a   addrEnd);.    .
27ed0 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67    } /* endif agg
27ee0 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
27ef0 0a 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 54  .  if( distinctT
27f00 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 65 78 70  ab>=0 ){.    exp
27f10 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
27f20 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22  arse, "DISTINCT"
27f30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
27f40 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
27f50 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
27f60 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
27f70 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
27f80 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
27f90 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
27fa0 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
27fb0 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
27fc0 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54   ){.    explainT
27fd0 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
27fe0 20 22 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20   "ORDER BY");.  
27ff0 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61    generateSortTa
28000 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c  il(pParse, p, v,
28010 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
28020 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pDest);.  }..  /
28030 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
28040 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20  kip this query. 
28050 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
28060 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
28070 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68   iEnd);..  /* Th
28080 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75 63  e SELECT was suc
28090 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e  cessfully coded.
280a0 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75 72     Set the retur
280b0 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a  n code to 0.  **
280c0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20   to indicate no 
280d0 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72  errors..  */.  r
280e0 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  c = 0;..  /* Con
280f0 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
28100 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
28110 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
28120 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
28130 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
28140 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
28150 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
28160 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  nd:.  explainSet
28170 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e  Integer(pParse->
28180 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74  iSelectId, iRest
28190 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20  oreSelectId);.. 
281a0 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c   /* Identify col
281b0 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73  umn names if res
281c0 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45  ults of the SELE
281d0 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74  CT are to be out
281e0 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  put..  */.  if( 
281f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28200 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
28210 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
28220 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
28230 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
28240 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
28250 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62    }..  sqlite3Db
28260 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66  Free(db, sAggInf
28270 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  o.aCol);.  sqlit
28280 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
28290 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20  gInfo.aFunc);.  
282a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
282b0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
282c0 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
282d0 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  LAIN)./*.** Gene
282e0 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61  rate a human-rea
282f0 64 61 62 6c 65 20 64 65 73 63 72 69 70 74 69 6f  dable descriptio
28300 6e 20 6f 66 20 61 20 74 68 65 20 53 65 6c 65 63  n of a the Selec
28310 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  t object..*/.sta
28320 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
28330 4f 6e 65 53 65 6c 65 63 74 28 56 64 62 65 20 2a  OneSelect(Vdbe *
28340 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70  pVdbe, Select *p
28350 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  ){.  sqlite3Expl
28360 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
28370 20 22 53 45 4c 45 43 54 20 22 29 3b 0a 20 20 69   "SELECT ");.  i
28380 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
28390 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
283a0 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20  _Aggregate) ){. 
283b0 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61     if( p->selFla
283c0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
283d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
283e0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
283f0 56 64 62 65 2c 20 22 44 49 53 54 49 4e 43 54 20  Vdbe, "DISTINCT 
28400 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
28410 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
28420 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a  SF_Aggregate ){.
28430 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28440 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
28450 2c 20 22 61 67 67 5f 66 6c 61 67 20 22 29 3b 0a  , "agg_flag ");.
28460 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
28470 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
28480 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
28490 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
284a0 65 2c 20 22 20 20 20 22 29 3b 0a 20 20 7d 0a 20  e, "   ");.  }. 
284b0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
284c0 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70  xprList(pVdbe, p
284d0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c  ->pEList);.  sql
284e0 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
284f0 64 62 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  dbe);.  if( p->p
28500 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e  Src && p->pSrc->
28510 6e 53 72 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  nSrc ){.    int 
28520 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  i;.    sqlite3Ex
28530 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
28540 65 2c 20 22 46 52 4f 4d 20 22 29 3b 0a 20 20 20  e, "FROM ");.   
28550 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
28560 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20 20 20  ush(pVdbe);.    
28570 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53  for(i=0; i<p->pS
28580 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
28590 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
285a0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
285b0 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   = &p->pSrc->a[i
285c0 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
285d0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
285e0 64 62 65 2c 20 22 7b 25 64 2c 2a 7d 20 3d 20 22  dbe, "{%d,*} = "
285f0 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
28600 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
28610 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
28620 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
28630 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 56 64 62  plainSelect(pVdb
28640 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
28650 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
28660 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20  pItem->pTab ){. 
28670 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28680 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28690 64 62 65 2c 20 22 20 28 74 61 62 6e 61 6d 65 3d  dbe, " (tabname=
286a0 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  %s)", pItem->pTa
286b0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
286c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
286d0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   if( pItem->zNam
286e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
286f0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
28700 66 28 70 56 64 62 65 2c 20 22 25 73 22 2c 20 70  f(pVdbe, "%s", p
28710 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
28720 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
28730 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
28740 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28750 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28760 64 62 65 2c 20 22 20 28 41 53 20 25 73 29 22 2c  dbe, " (AS %s)",
28770 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
28780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
28790 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  f( pItem->jointy
287a0 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a  pe & JT_LEFT ){.
287b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
287c0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
287d0 62 65 2c 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22  be, " LEFT-JOIN"
287e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
287f0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
28800 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 7d 0a  L(pVdbe);.    }.
28810 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28820 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 20 20  inPop(pVdbe);.  
28830 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  }.  if( p->pWher
28840 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
28850 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28860 64 62 65 2c 20 22 57 48 45 52 45 20 22 29 3b 0a  dbe, "WHERE ");.
28870 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28880 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d  inExpr(pVdbe, p-
28890 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71  >pWhere);.    sq
288a0 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
288b0 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
288c0 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a   p->pGroupBy ){.
288d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
288e0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
288f0 22 47 52 4f 55 50 42 59 20 22 29 3b 0a 20 20 20  "GROUPBY ");.   
28900 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
28910 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70  xprList(pVdbe, p
28920 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  ->pGroupBy);.   
28930 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
28940 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  L(pVdbe);.  }.  
28950 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29  if( p->pHaving )
28960 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
28970 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
28980 2c 20 22 48 41 56 49 4e 47 20 22 29 3b 0a 20 20  , "HAVING ");.  
28990 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
289a0 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70  Expr(pVdbe, p->p
289b0 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c  Having);.    sql
289c0 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
289d0 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
289e0 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
289f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
28a00 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
28a10 4f 52 44 45 52 42 59 20 22 29 3b 0a 20 20 20 20  ORDERBY ");.    
28a20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
28a30 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d  prList(pVdbe, p-
28a40 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
28a50 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
28a60 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
28a70 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
28a80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28a90 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
28aa0 22 4c 49 4d 49 54 20 22 29 3b 0a 20 20 20 20 73  "LIMIT ");.    s
28ab0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
28ac0 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 4c 69 6d  r(pVdbe, p->pLim
28ad0 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  it);.    sqlite3
28ae0 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
28af0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
28b00 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 73 71  Offset ){.    sq
28b10 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
28b20 74 66 28 70 56 64 62 65 2c 20 22 4f 46 46 53 45  tf(pVdbe, "OFFSE
28b30 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  T ");.    sqlite
28b40 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64  3ExplainExpr(pVd
28b50 62 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  be, p->pOffset);
28b60 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
28b70 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
28b80 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
28b90 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 56 64  ExplainSelect(Vd
28ba0 62 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63  be *pVdbe, Selec
28bb0 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  t *p){.  if( p==
28bc0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
28bd0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
28be0 64 62 65 2c 20 22 28 6e 75 6c 6c 2d 73 65 6c 65  dbe, "(null-sele
28bf0 63 74 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ct)");.    retur
28c00 6e 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  n;.  }.  while( 
28c10 70 2d 3e 70 50 72 69 6f 72 20 29 20 70 20 3d 20  p->pPrior ) p = 
28c20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 73 71 6c  p->pPrior;.  sql
28c30 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
28c40 70 56 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28  pVdbe);.  while(
28c50 20 70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69   p ){.    explai
28c60 6e 4f 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65  nOneSelect(pVdbe
28c70 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  , p);.    p = p-
28c80 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
28c90 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  p==0 ) break;.  
28ca0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
28cb0 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73  NL(pVdbe);.    s
28cc0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
28cd0 6e 74 66 28 70 56 64 62 65 2c 20 22 25 73 5c 6e  ntf(pVdbe, "%s\n
28ce0 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
28cf0 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73  p->op));.  }.  s
28d00 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
28d10 6e 74 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22  ntf(pVdbe, "END"
28d20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
28d30 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d  ainPop(pVdbe);.}
28d40 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ../* End of the 
28d50 73 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20  structure debug 
28d60 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a  printing code.**
28d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e  ***********/.#en
28dc0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
28dd0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
28de0 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a        E_EXPLAIN) */.