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

Artifact 1278b07a8c9a7f2f65b8efa8565993a56c4a58a3:


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 2c 20 20 20 20 20 20 20 20 20 20 20 2f  nct,           /
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 3e 3d 30 3b 0a 20 20   distinct>=0;.  
4bc0: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
4bd0: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
4be0: 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  ){.    codeOffse
4bf0: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
4c00: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75  e);.  }..  /* Pu
4c10: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
4c20: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
4c30: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
4c40: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4c50: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
4c60: 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74  lse{.    nResult
4c70: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
4c80: 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  xpr;.  }.  if( p
4c90: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
4ca0: 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  {.    pDest->iSd
4cb0: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
4cc0: 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e  m+1;.    pDest->
4cd0: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
4ce0: 6f 6c 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ol;.    pParse->
4cf0: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
4d00: 6f 6c 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20  ol;.  }else{ .  
4d10: 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
4d20: 3e 6e 53 64 73 74 3d 3d 6e 52 65 73 75 6c 74 43  >nSdst==nResultC
4d30: 6f 6c 20 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52  ol );.  }.  regR
4d40: 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69  esult = pDest->i
4d50: 53 64 73 74 3b 0a 20 20 69 66 28 20 6e 43 6f 6c  Sdst;.  if( nCol
4d60: 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72  umn>0 ){.    for
4d70: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
4d80: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
4d90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4da0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
4db0: 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c  Tab, i, regResul
4dc0: 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  t+i);.    }.  }e
4dd0: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
4de0: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
4df0: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
4e00: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
4e10: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
4e20: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
4e30: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
4e40: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
4e50: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
4e60: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
4e70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
4e80: 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
4e90: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4ea0: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
4eb0: 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67  rse, pEList, reg
4ec0: 52 65 73 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53  Result, eDest==S
4ed0: 52 54 5f 4f 75 74 70 75 74 29 3b 0a 20 20 7d 0a  RT_Output);.  }.
4ee0: 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73    nColumn = nRes
4ef0: 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66  ultCol;..  /* If
4f00: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4f10: 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e  yword was presen
4f20: 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20  t on the SELECT 
4f30: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61  statement.  ** a
4f40: 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20  nd this row has 
4f50: 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65  been seen before
4f60: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61  , then do not ma
4f70: 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a  ke this row.  **
4f80: 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73   part of the res
4f90: 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ult..  */.  if( 
4fa0: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
4fb0: 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
4fc0: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
4fd0: 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt( pEList->nExp
4fe0: 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  r==nColumn );.  
4ff0: 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
5000: 50 61 72 73 65 2c 20 64 69 73 74 69 6e 63 74 2c  Parse, distinct,
5010: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c   iContinue, nCol
5020: 75 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74 29 3b  umn, regResult);
5030: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
5040: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  y==0 ){.      co
5050: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69  deOffset(v, p, i
5060: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d  Continue);.    }
5070: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
5080: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
5090: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
50a0: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
50b0: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
50c0: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
50d0: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
50e0: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
50f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5100: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
5110: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
5120: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ion: {.      int
5130: 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20   r1;.      r1 = 
5140: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
5150: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
5160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5170: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
5180: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
5190: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
51a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
51b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
51c0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
51d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
51e0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
51f0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5200: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5210: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
5220: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
5230: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
5240: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
5250: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
5260: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
5270: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
5280: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
5290: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
52a0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
52b0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
52c0: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
52d0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
52e0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
52f0: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
5300: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  m, regResult, nC
5310: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
5320: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5330: 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  f..    /* Store 
5340: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
5350: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
5360: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
5370: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
5380: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
5390: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
53a0: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
53b0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
53c0: 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  se);.      testc
53d0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
53e0: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
53f0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
5400: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
5410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5420: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
5430: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
5440: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31  ult, nColumn, r1
5450: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
5460: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
5470: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5480: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
5490: 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  , p, r1);.      
54a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
54b0: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
54c0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
54d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
54e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
54f0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
5500: 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  rm, r2);.       
5510: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5520: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
5530: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b   iParm, r1, r2);
5540: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5550: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
5560: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
5570: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
5580: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
5590: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
55a0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
55b0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
55c0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
55d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
55e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
55f0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
5600: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
5610: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
5620: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
5630: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
5640: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
5650: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
5660: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
5670: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
5680: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
5690: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
56a0: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
56b0: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
56c0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
56d0: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
56e0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
56f0: 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69  .      p->affini
5700: 74 79 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ty = sqlite3Comp
5710: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69  areAffinity(pELi
5720: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
5730: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b  pDest->affSdst);
5740: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
5750: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rBy ){.        /
5760: 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63  * At first glanc
5770: 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e  e you would thin
5780: 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d  k we could optim
5790: 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20  ize out the.    
57a0: 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
57b0: 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e  in this case sin
57c0: 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  ce the order of 
57d0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73  entries in the s
57e0: 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  et.        ** do
57f0: 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20  es not matter.  
5800: 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20  But there might 
5810: 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  be a LIMIT claus
5820: 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20  e, in which.    
5830: 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20      ** case the 
5840: 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65  order does matte
5850: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73  r */.        pus
5860: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
5870: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
5880: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
5890: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
58a0: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
58b0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
58c0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
58d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
58e0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
58f0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20  , regResult, 1, 
5900: 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79  r1, &p->affinity
5910: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
5920: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
5930: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
5940: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
5950: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
5960: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5970: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
5980: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
5990: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
59a0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
59b0: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r1);.      }.  
59c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
59d0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20  ..    /* If any 
59e0: 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65  row exist in the
59f0: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
5a00: 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
5a10: 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
5a20: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
5a30: 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
5a40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5a50: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
5a60: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f   iParm);.      /
5a70: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
5a80: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
5a90: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
5aa0: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
5ab0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5ac0: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
5ad0: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
5ae0: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
5af0: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
5b00: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
5b10: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
5b20: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
5b30: 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
5b40: 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
5b50: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
5b60: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
5b70: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
5b80: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
5b90: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
5ba0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
5bb0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
5bc0: 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  r(pParse, pOrder
5bd0: 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  By, p, regResult
5be0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5bf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5c00: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
5c10: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 69  se, regResult, i
5c20: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
5c30: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
5c40: 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
5c50: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
5c60: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
5c70: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5c80: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
5c90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5ca0: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
5cb0: 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20      /* Send the 
5cc0: 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c  data to the call
5cd0: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72  back function or
5ce0: 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
5cf0: 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a  .  In the.    **
5d00: 20 63 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f   case of a subro
5d10: 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f  utine, the subro
5d20: 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20  utine itself is 
5d30: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a  responsible for.
5d40: 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74      ** popping t
5d50: 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  he data from the
5d60: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20   stack..    */. 
5d70: 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f     case SRT_Coro
5d80: 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20  utine:.    case 
5d90: 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a 20 20  SRT_Output: {.  
5da0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
5db0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
5dc0: 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ne );.      test
5dd0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
5de0: 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
5df0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
5e00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
5e10: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5e20: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
5e30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5e40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
5e50: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
5e60: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29  lt, nColumn, r1)
5e70: 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  ;.        pushOn
5e80: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
5e90: 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31   pOrderBy, p, r1
5ea0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5eb0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
5ec0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
5ed0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
5ee0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
5ef0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
5f00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5f10: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
5f20: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
5f30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5f40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5f50: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
5f60: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
5f70: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
5f80: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
5f90: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
5fa0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
5fb0: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  ult, nColumn);. 
5fc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5fd0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21  ak;.    }..#if !
5fe0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
5ff0: 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20  MIT_TRIGGER).   
6000: 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
6010: 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69  results.  This i
6020: 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43  s used for SELEC
6030: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  T statements ins
6040: 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  ide.    ** the b
6050: 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52  ody of a TRIGGER
6060: 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  .  The purpose o
6070: 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69  f such selects i
6080: 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  s to call.    **
6090: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
60a0: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76  nctions that hav
60b0: 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20  e side effects. 
60c0: 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a   We do not care.
60d0: 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65      ** about the
60e0: 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20   actual results 
60f0: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20  of the select.. 
6100: 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
6110: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
6120: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t( eDest==SRT_Di
6130: 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62  scard );.      b
6140: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
6150: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  if.  }..  /* Jum
6160: 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
6170: 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
6180: 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
6190: 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20  .  Except, if.  
61a0: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73 6f  ** there is a so
61b0: 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63  rter, in which c
61c0: 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20 68  ase the sorter h
61d0: 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74  as already limit
61e0: 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70  ed.  ** the outp
61f0: 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a  ut for us..  */.
6200: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
6210: 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29  0 && p->iLimit )
6220: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6230: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
6240: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
6250: 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20   iBreak, -1);.  
6260: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
6270: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
6280: 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ist, generate a 
6290: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
62a0: 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a  e that records.*
62b0: 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * the collating 
62c0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63  sequence for eac
62d0: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
62e0: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
62f0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  list..**.** If t
6300: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61  he ExprList is a
6310: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
6320: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68  OUP BY clause th
6330: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  en the resulting
6340: 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  .** KeyInfo stru
6350: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
6360: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
6370: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20  izing a virtual 
6380: 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c  index to.** impl
6390: 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73  ement that claus
63a0: 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c  e.  If the ExprL
63b0: 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  ist is the resul
63c0: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
63d0: 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65  T.** then the Ke
63e0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
63f0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
6400: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
6410: 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64  a virtual.** ind
6420: 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ex to implement 
6430: 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e  a DISTINCT test.
6440: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
6450: 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
6460: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
6470: 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  tain from malloc
6480: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  .  The calling.*
6490: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
64a0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65  sponsible for se
64b0: 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73  eing that this s
64c0: 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e  tructure is even
64d0: 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e  tually.** freed.
64e0: 20 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66    Add the KeyInf
64f0: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  o structure to t
6500: 68 65 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61  he P4 field of a
6510: 6e 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a  n opcode using.*
6520: 2a 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  * P4_KEYINFO_HAN
6530: 44 4f 46 46 20 69 73 20 74 68 65 20 75 73 75 61  DOFF is the usua
6540: 6c 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67  l way of dealing
6550: 20 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73   with this..*/.s
6560: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
6570: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
6580: 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  st(Parse *pParse
6590: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
65a0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t){.  sqlite3 *d
65b0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
65c0: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b    int nExpr;.  K
65d0: 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  eyInfo *pInfo;. 
65e0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
65f0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
6600: 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20  int i;..  nExpr 
6610: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
6620: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
6630: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
6640: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29  , sizeof(*pInfo)
6650: 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66   + nExpr*(sizeof
6660: 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b  (CollSeq*)+1) );
6670: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
6680: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
6690: 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49  Order = (u8*)&pI
66a0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72  nfo->aColl[nExpr
66b0: 5d 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46  ];.    pInfo->nF
66c0: 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 45 78 70  ield = (u16)nExp
66d0: 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e  r;.    pInfo->en
66e0: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
66f0: 20 70 49 6e 66 6f 2d 3e 64 62 20 3d 20 64 62 3b   pInfo->db = db;
6700: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
6710: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
6720: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
6730: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  m++){.      Coll
6740: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
6750: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
6760: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
6770: 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
6780: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  r);.      if( !p
6790: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
67a0: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
67b0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
67c0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
67d0: 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[i] = pColl;.  
67e0: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
67f0: 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d  Order[i] = pItem
6800: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
6810: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6820: 70 49 6e 66 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65  pInfo;.}..#ifnde
6830: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
6840: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
6850: 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20  .** Name of the 
6860: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61  connection opera
6870: 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72  tor, used for er
6880: 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f  ror messages..*/
6890: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
68a0: 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65  ar *selectOpName
68b0: 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72  (int id){.  char
68c0: 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69   *z;.  switch( i
68d0: 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  d ){.    case TK
68e0: 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20  _ALL:       z = 
68f0: 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62  "UNION ALL";   b
6900: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
6910: 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d  K_INTERSECT: z =
6920: 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20   "INTERSECT";   
6930: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
6940: 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20  TK_EXCEPT:    z 
6950: 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20  = "EXCEPT";     
6960: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
6970: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a  ult:           z
6980: 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20   = "UNION";     
6990: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
69a0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
69b0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
69c0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
69d0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
69e0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
69f0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e  ./*.** Unless an
6a00: 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
6a10: 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73  PLAN" command is
6a20: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
6a30: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
6a40: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  ** is a no-op. O
6a50: 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64  therwise, it add
6a60: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
6a70: 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20  f output to the 
6a80: 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77  EQP result,.** w
6a90: 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e  here the caption
6aa0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
6ab0: 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45  .**.**   "USE TE
6ac0: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78  MP B-TREE FOR xx
6ad0: 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78  x".**.** where x
6ae0: 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49  xx is one of "DI
6af0: 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20  STINCT", "ORDER 
6b00: 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59  BY" or "GROUP BY
6b10: 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68  ". Exactly which
6b20: 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65  .** is determine
6b30: 64 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20  d by the zUsage 
6b40: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
6b50: 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
6b60: 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20  TempTable(Parse 
6b70: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
6b80: 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20  har *zUsage){.  
6b90: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
6ba0: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
6bb0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
6bc0: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
6bd0: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
6be0: 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
6bf0: 62 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54  b, "USE TEMP B-T
6c00: 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73  REE FOR %s", zUs
6c10: 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  age);.    sqlite
6c20: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
6c30: 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
6c40: 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
6c50: 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
6c60: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
6c70: 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65  .** Assign expre
6c80: 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75  ssion b to lvalu
6c90: 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e  e a. A second, n
6ca0: 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66  o-op, version of
6cb0: 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69   this macro.** i
6cc0: 73 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20  s provided when 
6cd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
6ce0: 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20  AIN is defined. 
6cf0: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
6d00: 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74  code.** in sqlit
6d10: 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73  e3Select() to as
6d20: 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73  sign values to s
6d30: 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20  tructure member 
6d40: 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a  variables that.*
6d50: 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20  * only exist if 
6d60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
6d70: 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  AIN is not defin
6d80: 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75  ed without pollu
6d90: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65  ting the.** code
6da0: 20 77 69 74 68 20 23 69 66 6e 64 65 66 20 64 69   with #ifndef di
6db0: 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64  rectives..*/.# d
6dc0: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74  efine explainSet
6dd0: 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61 20  Integer(a, b) a 
6de0: 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f  = b..#else./* No
6df0: 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  -op versions of 
6e00: 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29  the explainXXX()
6e10: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d   functions and m
6e20: 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69  acros. */.# defi
6e30: 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61  ne explainTempTa
6e40: 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e  ble(y,z).# defin
6e50: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
6e60: 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  ger(y,z).#endif.
6e70: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
6e80: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
6e90: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
6ea0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
6eb0: 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a  UND_SELECT)./*.*
6ec0: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
6ed0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
6ee0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
6ef0: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
6f00: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
6f10: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
6f20: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
6f30: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
6f40: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
6f50: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
6f60: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
6f70: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f  f one of the two
6f80: 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   forms:.**.**   
6f90: 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55  "COMPOSITE SUBQU
6fa0: 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20  ERIES iSub1 and 
6fb0: 69 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20  iSub2 (op)".**  
6fc0: 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51   "COMPOSITE SUBQ
6fd0: 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64  UERIES iSub1 and
6fe0: 20 69 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d   iSub2 USING TEM
6ff0: 50 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a  P B-TREE (op)".*
7000: 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31  *.** where iSub1
7010: 20 61 6e 64 20 69 53 75 62 32 20 61 72 65 20 74   and iSub2 are t
7020: 68 65 20 69 6e 74 65 67 65 72 73 20 70 61 73 73  he integers pass
7030: 65 64 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  ed as the corres
7040: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  ponding.** funct
7050: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20  ion parameters, 
7060: 61 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74 65  and op is the te
7070: 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  xt representatio
7080: 6e 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  n of the paramet
7090: 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  er.** of the sam
70a0: 65 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61  e name. The para
70b0: 6d 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20  meter "op" must 
70c0: 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49  be one of TK_UNI
70d0: 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a  ON, TK_EXCEPT,.*
70e0: 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f  * TK_INTERSECT o
70f0: 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69  r TK_ALL. The fi
7100: 72 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64  rst form is used
7110: 20 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73   if argument bUs
7120: 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73  eTmp is .** fals
7130: 65 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  e, or the second
7140: 20 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74   form if it is t
7150: 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rue..*/.static v
7160: 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  oid explainCompo
7170: 73 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70  site(.  Parse *p
7180: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
7190: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
71a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
71b0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
71d0: 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e   One of TK_UNION
71e0: 2c 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e  , TK_EXCEPT etc.
71f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c   */.  int iSub1,
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72        /* Subquer
7220: 79 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20  y id 1 */.  int 
7230: 69 53 75 62 32 2c 20 20 20 20 20 20 20 20 20 20  iSub2,          
7240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7250: 75 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a  ubquery id 2 */.
7260: 20 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20    int bUseTmp   
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74    /* True if a t
7290: 65 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75 73  emp table was us
72a0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
72b0: 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  t( op==TK_UNION 
72c0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  || op==TK_EXCEPT
72d0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
72e0: 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41  SECT || op==TK_A
72f0: 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  LL );.  if( pPar
7300: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
7310: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
7320: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
7330: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
7340: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a  sqlite3MPrintf(.
7350: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
7360: 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55  db, "COMPOUND SU
7370: 42 51 55 45 52 49 45 53 20 25 64 20 41 4e 44 20  BQUERIES %d AND 
7380: 25 64 20 25 73 28 25 73 29 22 2c 20 69 53 75 62  %d %s(%s)", iSub
7390: 31 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20  1, iSub2,.      
73a0: 20 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47    bUseTmp?"USING
73b0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22   TEMP B-TREE ":"
73c0: 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
73d0: 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  op).    );.    s
73e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
73f0: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
7400: 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
7410: 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
7420: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
7430: 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70  }.#else./* No-op
7440: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
7450: 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75   explainXXX() fu
7460: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72  nctions and macr
7470: 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  os. */.# define 
7480: 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
7490: 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64  (v,w,x,y,z).#end
74a0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
74b0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20   inner loop was 
74c0: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
74d0: 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65  a non-null pOrde
74e0: 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  rBy argument,.**
74f0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
7500: 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e  s were placed in
7510: 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65   a sorter.  Afte
7520: 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65  r the loop is te
7530: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e  rminated.** we n
7540: 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73  eed to run the s
7550: 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74  orter and output
7560: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
7570: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
7580: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
7590: 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65  s the code neede
75a0: 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  d to do that..*/
75b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
75c0: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20  erateSortTail(. 
75d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
75e0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
75f0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
7600: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  t *p,        /* 
7610: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
7620: 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ment */.  Vdbe *
7630: 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  v,          /* G
7640: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
7650: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
7660: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
7670: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7680: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
7690: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
76a0: 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20  *pDest /* Write 
76b0: 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c  the sorted resul
76c0: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
76d0: 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20  int addrBreak = 
76e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
76f0: 61 62 65 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20  abel(v);     /* 
7700: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69  Jump here to exi
7710: 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  t loop */.  int 
7720: 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73  addrContinue = s
7730: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
7740: 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70  bel(v);  /* Jump
7750: 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63   here for next c
7760: 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ycle */.  int ad
7770: 64 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a  dr;.  int iTab;.
7780: 20 20 69 6e 74 20 70 73 65 75 64 6f 54 61 62 20    int pseudoTab 
7790: 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  = 0;.  ExprList 
77a0: 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
77b0: 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20  OrderBy;..  int 
77c0: 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65  eDest = pDest->e
77d0: 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72  Dest;.  int iPar
77e0: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
77f0: 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65 67 52 6f  rm;..  int regRo
7800: 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69  w;.  int regRowi
7810: 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f 72  d;..  iTab = pOr
7820: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b  derBy->iECursor;
7830: 0a 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69  .  regRow = sqli
7840: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
7850: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 65 44 65  arse);.  if( eDe
7860: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
7870: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
7880: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73  outine ){.    ps
7890: 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65  eudoTab = pParse
78a0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71  ->nTab++;.    sq
78b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
78c0: 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
78d0: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 72 65 67  , pseudoTab, reg
78e0: 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Row, nColumn);. 
78f0: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b     regRowid = 0;
7900: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
7910: 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  gRowid = sqlite3
7920: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
7930: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
7940: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
7950: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
7960: 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d  int regSortOut =
7970: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
7980: 0a 20 20 20 20 69 6e 74 20 70 74 61 62 32 20 3d  .    int ptab2 =
7990: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
79a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
79b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
79c0: 6e 50 73 65 75 64 6f 2c 20 70 74 61 62 32 2c 20  nPseudo, ptab2, 
79d0: 72 65 67 53 6f 72 74 4f 75 74 2c 20 70 4f 72 64  regSortOut, pOrd
79e0: 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a  erBy->nExpr+2);.
79f0: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
7a00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7a10: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
7a20: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
7a30: 61 6b 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  ak);.    codeOff
7a40: 73 65 74 28 76 2c 20 70 2c 20 61 64 64 72 43 6f  set(v, p, addrCo
7a50: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c  ntinue);.    sql
7a60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7a70: 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
7a80: 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75   iTab, regSortOu
7a90: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
7aa0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7ab0: 43 6f 6c 75 6d 6e 2c 20 70 74 61 62 32 2c 20 70  Column, ptab2, p
7ac0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
7ad0: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 73  , regRow);.    s
7ae0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7af0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45  P5(v, OPFLAG_CLE
7b00: 41 52 43 41 43 48 45 29 3b 0a 20 20 7d 65 6c 73  ARCACHE);.  }els
7b10: 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  e{.    addr = 1 
7b20: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
7b30: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20  Op2(v, OP_Sort, 
7b40: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
7b50: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
7b60: 28 76 2c 20 70 2c 20 61 64 64 72 43 6f 6e 74 69  (v, p, addrConti
7b70: 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nue);.    sqlite
7b80: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7b90: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
7ba0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
7bb0: 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 7d 0a  1, regRow);.  }.
7bc0: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
7bd0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
7be0: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
7bf0: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
7c00: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7c10: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
7c20: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7c30: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
7c40: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
7c50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7c60: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
7c70: 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  d, iParm, regRow
7c80: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
7c90: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7ca0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
7cb0: 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77  , regRow, regRow
7cc0: 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
7cd0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
7ce0: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
7cf0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7d00: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
7d10: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
7d20: 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  Y.    case SRT_S
7d30: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
7d40: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
7d50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7d60: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
7d70: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
7d80: 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 2c  ow, 1, regRowid,
7d90: 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31   &p->affinity, 1
7da0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7db0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
7dc0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
7dd0: 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20  regRow, 1);.    
7de0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7df0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
7e00: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
7e10: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65  owid);.      bre
7e20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7e30: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
7e40: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
7e50: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
7e60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
7e70: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
7e80: 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20  ow, iParm, 1);. 
7e90: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
7ea0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
7eb0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
7ec0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
7ed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7ee0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
7ef0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  : {.      int i;
7f00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
7f10: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
7f20: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
7f30: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
7f40: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
7f50: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
7f60: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7f70: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
7f80: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
7f90: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
7fa0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
7fb0: 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f 77    assert( regRow
7fc0: 21 3d 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 69  !=pDest->iSdst+i
7fd0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
7fe0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7ff0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75   OP_Column, pseu
8000: 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74 2d  doTab, i, pDest-
8010: 3e 69 53 64 73 74 2b 69 29 3b 0a 20 20 20 20 20  >iSdst+i);.     
8020: 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20     if( i==0 ){. 
8030: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8040: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
8050: 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48  OPFLAG_CLEARCACH
8060: 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  E);.        }.  
8070: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8080: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
8090: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
80a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
80b0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
80c0: 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43  pDest->iSdst, nC
80d0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
80e0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
80f0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
8100: 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53  Parse, pDest->iS
8110: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
8120: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8130: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8140: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
8150: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
8160: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
8170: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8180: 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
8190: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
81a0: 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 71  e, regRow);.  sq
81b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
81c0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
81d0: 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  owid);..  /* The
81e0: 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c   bottom of the l
81f0: 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
8200: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
8210: 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e  el(v, addrContin
8220: 75 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  ue);.  if( p->se
8230: 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53  lFlags & SF_UseS
8240: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  orter ){.    sql
8250: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8260: 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
8270: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20   iTab, addr);.  
8280: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
8290: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
82a0: 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  OP_Next, iTab, a
82b0: 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ddr);.  }.  sqli
82c0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
82d0: 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
82e0: 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  );.  if( eDest==
82f0: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
8300: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
8310: 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ne ){.    sqlite
8320: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8330: 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54  P_Close, pseudoT
8340: 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ab, 0);.  }.}../
8350: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
8360: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
8370: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
8380: 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79   'declaration ty
8390: 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78  pe' of the.** ex
83a0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
83b0: 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62  The string may b
83c0: 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61  e treated as sta
83d0: 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65  tic by the calle
83e0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63  r..**.** The dec
83f0: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
8400: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
8410: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
8420: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
8430: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52  e.** original CR
8440: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
8450: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
8460: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
8470: 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61  mn. The.** decla
8480: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
8490: 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73  a ROWID field is
84a0: 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c   INTEGER. Exactl
84b0: 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73  y when an expres
84c0: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  sion.** is consi
84d0: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63  dered a column c
84e0: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e  an be complex in
84f0: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
8500: 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65   subqueries. The
8510: 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65  .** result-set e
8520: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c  xpression in all
8530: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
8540: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
8550: 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69  nts is .** consi
8560: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62  dered a column b
8570: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
8580: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
8590: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
85a0: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
85b0: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
85c0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
85d0: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
85e0: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  );.**   SELECT a
85f0: 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  bc FROM (SELECT 
8600: 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20  col AS abc FROM 
8610: 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  tbl);.** .** The
8620: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
8630: 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73  e for any expres
8640: 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  sion other than 
8650: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  a column is NULL
8660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
8670: 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79  t char *columnTy
8680: 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  pe(.  NameContex
8690: 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20  t *pNC, .  Expr 
86a0: 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20  *pExpr,.  const 
86b0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44  char **pzOriginD
86c0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
86d0: 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20  **pzOriginTab,. 
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 43 6f 6c 0a 29 7b 0a 20 20 63  OriginCol.){.  c
8700: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65  har const *zType
8710: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
8720: 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20  st *zOriginDb = 
8730: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
8740: 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30 3b  *zOriginTab = 0;
8750: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
8760: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20  OriginCol = 0;. 
8770: 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 4e 45   int j;.  if( NE
8780: 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c 7c  VER(pExpr==0) ||
8790: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d   pNC->pSrcList==
87a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
87b0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
87c0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
87d0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
87e0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
87f0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
8800: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
8810: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
8820: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
8830: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
8840: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
8850: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
8860: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
8870: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
8880: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
8890: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
88a0: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
88b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
88c0: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
88d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
88e0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
88f0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
8900: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
8910: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
8920: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
8930: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
8940: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
8950: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
8960: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
8970: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
8980: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
8990: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
89a0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
89b0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
89c0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
89d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
89e0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69  UMN );.      whi
89f0: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
8a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
8a10: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
8a20: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
8a30: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
8a40: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
8a50: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
8a60: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
8a70: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
8a80: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
8a90: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
8aa0: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
8ab0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
8ac0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
8ad0: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
8ae0: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
8af0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8b00: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
8b10: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
8b20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
8b30: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
8b40: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
8b50: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
8b60: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
8b70: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
8b80: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
8b90: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
8ba0: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
8bb0: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
8bc0: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
8bd0: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
8be0: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
8bf0: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
8c00: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
8c10: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
8c20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
8c30: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
8c40: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
8c50: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
8c60: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
8c70: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
8c80: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
8c90: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
8ca0: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
8cb0: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
8cc0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
8cd0: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
8ce0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
8cf0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
8d00: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
8d10: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
8d20: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
8d30: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
8d40: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
8d50: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
8d60: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
8d70: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
8d80: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
8d90: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
8da0: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
8db0: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
8dc0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
8dd0: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
8de0: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
8df0: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
8e00: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
8e10: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
8e20: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
8e30: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
8e40: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
8e50: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
8e60: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
8e70: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
8e80: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
8e90: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
8ea0: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
8eb0: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
8ec0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
8ed0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
8ee0: 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62  b && pExpr->pTab
8ef0: 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ==pTab );.      
8f00: 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20  if( pS ){.      
8f10: 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22    /* The "table"
8f20: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73   is actually a s
8f30: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76  ub-select or a v
8f40: 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  iew in the FROM 
8f50: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
8f60: 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  * of the SELECT 
8f70: 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72  statement. Retur
8f80: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
8f90: 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69  n type and origi
8fa0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  n.        ** dat
8fb0: 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  a for the result
8fc0: 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  -set column of t
8fd0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20  he sub-select.. 
8fe0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
8ff0: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
9000: 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d   ALWAYS(iCol<pS-
9010: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  >pEList->nExpr) 
9020: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
9030: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
9040: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
9050: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
9060: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
9070: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
9080: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
9090: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
90a0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
90b0: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
90c0: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
90d0: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
90e0: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
90f0: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
9100: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
9110: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
9120: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
9130: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
9140: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
9150: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
9160: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
9170: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
9180: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
9190: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
91a0: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
91b0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
91c0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
91d0: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69  &sNC, p, &zOrigi
91e0: 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62  nDb, &zOriginTab
91f0: 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20  , &zOriginCol); 
9200: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9210: 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
9220: 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  S(pTab->pSchema)
9230: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
9240: 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20   real table */. 
9250: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
9260: 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pS );.        if
9270: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
9280: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
9290: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
92a0: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
92b0: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
92c0: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
92d0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
92e0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
92f0: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
9300: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43          zOriginC
9310: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
9320: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9330: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
9340: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9350: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  zType;.         
9360: 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54   zOriginCol = pT
9370: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
9380: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
9390: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 54          zOriginT
93a0: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
93b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
93c0: 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20  C->pParse ){.   
93d0: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d         int iDb =
93e0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
93f0: 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73  Index(pNC->pPars
9400: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
9410: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
9420: 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e 43   zOriginDb = pNC
9430: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  ->pParse->db->aD
9440: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
9450: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9470: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
9480: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
9490: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
94a0: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
94b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
94c0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
94d0: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
94e0: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
94f0: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
9500: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
9510: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
9520: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
9530: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
9540: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
9550: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
9560: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
9570: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
9580: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
9590: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
95a0: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
95b0: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
95c0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
95d0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
95e0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
95f0: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
9600: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
9610: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
9620: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
9630: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
9640: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
9650: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
9660: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69  &sNC, p, &zOrigi
9670: 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62  nDb, &zOriginTab
9680: 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20  , &zOriginCol); 
9690: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
96a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
96b0: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e   .  if( pzOrigin
96c0: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
96d0: 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26  ( pzOriginTab &&
96e0: 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a   pzOriginCol );.
96f0: 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20      *pzOriginDb 
9700: 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20  = zOriginDb;.   
9710: 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20   *pzOriginTab = 
9720: 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20  zOriginTab;.    
9730: 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a  *pzOriginCol = z
9740: 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20  OriginCol;.  }. 
9750: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
9760: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
9770: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
9780: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
9790: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
97a0: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
97b0: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
97c0: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
97d0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
97e0: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
97f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
9800: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
9810: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
9820: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
9830: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
9840: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
9850: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
9860: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
9870: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
9880: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
9890: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
98a0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
98b0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
98c0: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
98d0: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
98e0: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
98f0: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
9900: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
9910: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
9920: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
9930: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
9940: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
9950: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
9960: 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
9970: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
9980: 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73  ETADATA.    cons
9990: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
99a0: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
99b0: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
99c0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
99d0: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
99e0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
99f0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
9a00: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
9a10: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29  gTab, &zOrigCol)
9a20: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64  ;..    /* The vd
9a30: 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73  be must make its
9a40: 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65   own copy of the
9a50: 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64   column-type and
9a60: 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   other .    ** c
9a70: 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73  olumn specific s
9a80: 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20  trings, in case 
9a90: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65  the schema is re
9aa0: 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a  set before this.
9ab0: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d      ** virtual m
9ac0: 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65  achine is delete
9ad0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
9ae0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
9af0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
9b00: 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69  E_DATABASE, zOri
9b10: 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  gDb, SQLITE_TRAN
9b20: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
9b30: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
9b40: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
9b50: 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c  TABLE, zOrigTab,
9b60: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
9b70: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
9b80: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
9b90: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55   i, COLNAME_COLU
9ba0: 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51  MN, zOrigCol, SQ
9bb0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
9bc0: 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65  .#else.    zType
9bd0: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
9be0: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b  NC, p, 0, 0, 0);
9bf0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
9c00: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
9c10: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
9c20: 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c  DECLTYPE, zType,
9c30: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
9c40: 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  T);.  }.#endif /
9c50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  * SQLITE_OMIT_DE
9c60: 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  CLTYPE */.}../*.
9c70: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
9c80: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
9c90: 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d  the VDBE the nam
9ca0: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
9cb0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
9cc0: 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  et.  This inform
9cd0: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
9ce0: 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20   provide the.** 
9cf0: 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69  azCol[] values i
9d00: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
9d10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
9d20: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
9d30: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
9d40: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
9d50: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
9d60: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
9d70: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
9d80: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
9d90: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
9da0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
9db0: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
9dc0: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
9dd0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
9de0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
9df0: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   j;.  sqlite3 *d
9e00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9e10: 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c    int fullNames,
9e20: 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69   shortNames;..#i
9e30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9e40: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
9e50: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
9e60: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
9e70: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
9e80: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
9e90: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9ea0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
9eb0: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
9ec0: 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30  et || NEVER(v==0
9ed0: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
9ee0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
9ef0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
9f00: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
9f10: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
9f20: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
9f30: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
9f40: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
9f50: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
9f60: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
9f70: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
9f80: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
9f90: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
9fa0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
9fb0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
9fc0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
9fd0: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
9fe0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
9ff0: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
a000: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
a010: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
a020: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63  zName ){.      c
a030: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
a040: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
a050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a060: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
a070: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
a080: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
a090: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
a0a0: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d  else if( (p->op=
a0b0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
a0c0: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
a0d0: 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74 20  MN) && pTabList 
a0e0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
a0f0: 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72  pTab;.      char
a100: 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e   *zCol;.      in
a110: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
a120: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
a130: 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61  =0; ALWAYS(j<pTa
a140: 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b  bList->nSrc); j+
a150: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
a160: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
a170: 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c  Cursor==p->iTabl
a180: 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  e ) break;.     
a190: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
a1a0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
a1b0: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
a1c0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
a1d0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
a1e0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
a1f0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
a200: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
a210: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
a220: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
a230: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
a240: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
a250: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69      zCol = "rowi
a260: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d";.      }else{
a270: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
a280: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a290: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
a2a0: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
a2b0: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
a2c0: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mes ){.        s
a2d0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
a2e0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
a2f0: 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20  ME_NAME, .      
a300: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
a310: 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  trDup(db, pEList
a320: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53  ->a[i].zSpan), S
a330: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
a340: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a350: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
a360: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
a370: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
a380: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
a390: 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
a3a0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
a3b0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
a3c0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
a3d0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
a3e0: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
a3f0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
a400: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a410: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a420: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
a430: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
a440: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
a450: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
a460: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a470: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
a480: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
a490: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20  NAME_NAME, .    
a4a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
a4b0: 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  trDup(db, pEList
a4c0: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53  ->a[i].zSpan), S
a4d0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
a4e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
a4f0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
a500: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
a510: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  , pEList);.}../*
a520: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20 65  .** Given a an e
a530: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
a540: 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
a550: 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
a560: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
a570: 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
a580: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
a590: 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
a5a0: 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
a5b0: 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
a5c0: 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
a5d0: 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
a5e0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
a5f0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
a600: 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
a610: 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
a620: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
a630: 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
a640: 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
a650: 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
a660: 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
a670: 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
a680: 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
a690: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
a6a0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
a6b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
a6c0: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
a6d0: 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
a6e0: 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
a6f0: 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
a700: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
a710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a720: 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
a730: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
a740: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
a750: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
a760: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
a770: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
a780: 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73       /* Expr lis
a790: 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  t from which to 
a7a0: 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61  derive column na
a7b0: 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e  mes */.  i16 *pn
a7c0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
a7d0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
a7e0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
a7f0: 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  here */.  Column
a800: 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20   **paCol        
a810: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
a820: 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  ew column list h
a830: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
a840: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
a850: 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62  ->db;   /* Datab
a860: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
a870: 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a890: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
a8a0: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20   */.  int cnt;  
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8c0: 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64    /* Index added
a8d0: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
a8e0: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f  e unique */.  Co
a8f0: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
a900: 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  l;        /* For
a910: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65   looping over re
a920: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
a930: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a950: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
a960: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
a970: 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a   set */.  Expr *
a980: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
a990: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
a9a0: 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ion for a single
a9b0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a   result column *
a9c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
a9f0: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa10: 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20  /* Size of name 
aa20: 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20  in zName[] */.. 
aa30: 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20   if( pEList ){. 
aa40: 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74     nCol = pEList
aa50: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f  ->nExpr;.    aCo
aa60: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  l = sqlite3DbMal
aa70: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
aa80: 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c  of(aCol[0])*nCol
aa90: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
aaa0: 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65   aCol==0 );.  }e
aab0: 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
aac0: 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b  0;.    aCol = 0;
aad0: 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20  .  }.  *pnCol = 
aae0: 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d  nCol;.  *paCol =
aaf0: 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d   aCol;..  for(i=
ab00: 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
ab10: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
ab20: 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61  +){.    /* Get a
ab30: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
ab40: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
ab50: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
ab60: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
ab70: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
ab80: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c   p->pRight==0 ||
ab90: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
aba0: 28 70 2d 3e 70 52 69 67 68 74 2c 20 45 50 5f 49  (p->pRight, EP_I
abb0: 6e 74 56 61 6c 75 65 29 0a 20 20 20 20 20 20 20  ntValue).       
abc0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 70 52          || p->pR
abd0: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d 3d  ight->u.zToken==
abe0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e  0 || p->pRight->
abf0: 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29  u.zToken[0]!=0 )
ac00: 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  ;.    if( (zName
ac10: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
ac20: 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
ac30: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
ac40: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
ac50: 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
ac60: 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
ac70: 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
ac80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
ac90: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
aca0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
acb0: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
acc0: 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a  ColExpr = p;  /*
acd0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
ace0: 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75  that is the resu
acf0: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  lt column name *
ad00: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
ad10: 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab;         /* 
ad20: 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  Table associated
ad30: 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65   with this expre
ad40: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77  ssion */.      w
ad50: 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e  hile( pColExpr->
ad60: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
ad70: 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d        pColExpr =
ad80: 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68   pColExpr->pRigh
ad90: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
ada0: 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29  t( pColExpr!=0 )
adb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
adc0: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
add0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41  ==TK_COLUMN && A
ade0: 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e  LWAYS(pColExpr->
adf0: 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
ae00: 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d      /* For colum
ae10: 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d  ns use the colum
ae20: 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20  n name name */. 
ae30: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
ae40: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c  = pColExpr->iCol
ae50: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61  umn;.        pTa
ae60: 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54  b = pColExpr->pT
ae70: 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ab;.        if( 
ae80: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
ae90: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
aea0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
aeb0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
aec0: 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "%s",.          
aed0: 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f         iCol>=0 ?
aee0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
aef0: 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64  ].zName : "rowid
af00: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
af10: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
af20: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
af30: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
af40: 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c  HasProperty(pCol
af50: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
af60: 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e  e) );.        zN
af70: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
af80: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70  intf(db, "%s", p
af90: 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ColExpr->u.zToke
afa0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
afb0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  .        /* Use 
afc0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
afd0: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
afe0: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
aff0: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
b000: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
b010: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
b020: 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ", pEList->a[i].
b030: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  zSpan);.      }.
b040: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
b050: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b060: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
b070: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
b080: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b090: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
b0a0: 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d  e sure the colum
b0b0: 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  n name is unique
b0c0: 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69  .  If the name i
b0d0: 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20  s not unique,.  
b0e0: 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e    ** append a in
b0f0: 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d  teger to the nam
b100: 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63  e so that it bec
b110: 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20  omes unique..   
b120: 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20   */.    nName = 
b130: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
b140: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
b150: 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  j=cnt=0; j<i; j+
b160: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
b170: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f  lite3StrICmp(aCo
b180: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  l[j].zName, zNam
b190: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
b1a0: 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b   char *zNewName;
b1b0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e  .        zName[n
b1c0: 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20  Name] = 0;.     
b1d0: 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71     zNewName = sq
b1e0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
b1f0: 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c   "%s:%d", zName,
b200: 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20   ++cnt);.       
b210: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b220: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
b230: 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e     zName = zNewN
b240: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  ame;.        j =
b250: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28   -1;.        if(
b260: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61   zName==0 ) brea
b270: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
b280: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  .    pCol->zName
b290: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20   = zName;.  }.  
b2a0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
b2b0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28  iled ){.    for(
b2c0: 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  j=0; j<i; j++){.
b2d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
b2e0: 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e  ree(db, aCol[j].
b2f0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
b300: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
b310: 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a  db, aCol);.    *
b320: 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a  paCol = 0;.    *
b330: 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72  pnCol = 0;.    r
b340: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
b350: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
b360: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b370: 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e  *.** Add type an
b380: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
b390: 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c  rmation to a col
b3a0: 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f  umn list based o
b3b0: 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74  n.** a SELECT st
b3c0: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20  atement..** .** 
b3d0: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
b3e0: 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20  presumably came 
b3f0: 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d  from selectColum
b400: 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69  nNamesFromExprLi
b410: 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c  st()..** The col
b420: 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c  umn list has onl
b430: 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70  y names, not typ
b440: 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73  es or collations
b450: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
b460: 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20  ne goes through 
b470: 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70  and adds the typ
b480: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
b490: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
b4a0: 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74  utine requires t
b4b0: 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69  hat all identifi
b4c0: 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ers in the SELEC
b4d0: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62  T.** statement b
b4e0: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73  e resolved..*/.s
b4f0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
b500: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
b510: 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61  dCollation(.  Pa
b520: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b530: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
b540: 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 69 6e 74  ontexts */.  int
b550: 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   nCol,          
b560: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b570: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f 6c  columns */.  Col
b580: 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20 20 20 20  umn *aCol,      
b590: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
b5a0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53 65 6c 65 63  lumns */.  Selec
b5b0: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
b5c0: 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
b5d0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
b5e0: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
b5f0: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
b600: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
b610: 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
b620: 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
b630: 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
b640: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
b650: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
b660: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
b670: 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72  tem *a;..  asser
b680: 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  t( pSelect!=0 );
b690: 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c  .  assert( (pSel
b6a0: 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
b6b0: 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20  SF_Resolved)!=0 
b6c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f  );.  assert( nCo
b6d0: 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  l==pSelect->pELi
b6e0: 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d  st->nExpr || db-
b6f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
b700: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
b710: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
b720: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  ;.  memset(&sNC,
b730: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
b740: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
b750: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
b760: 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d  ;.  a = pSelect-
b770: 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f  >pEList->a;.  fo
b780: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
b790: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ; i<nCol; i++, p
b7a0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  Col++){.    p = 
b7b0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
b7c0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71  pCol->zType = sq
b7d0: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
b7e0: 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  , columnType(&sN
b7f0: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b  C, p, 0, 0, 0));
b800: 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
b810: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
b820: 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
b830: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
b840: 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
b850: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
b860: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
b870: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
b880: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
b890: 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
b8a0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43  Coll ){.      pC
b8b0: 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ol->zColl = sqli
b8c0: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
b8d0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
b8e0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
b8f0: 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
b900: 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
b910: 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
b920: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
b930: 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
b940: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
b950: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
b960: 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
b970: 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
b980: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
b990: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
b9a0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c  ble *pTab;.  sql
b9b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b9c0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76  e->db;.  int sav
b9d0: 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65  edFlags;..  save
b9e0: 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
b9f0: 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  gs;.  db->flags 
ba00: 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43  &= ~SQLITE_FullC
ba10: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
ba20: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
ba30: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
ba40: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
ba50: 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
ba60: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  t, 0);.  if( pPa
ba70: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
ba80: 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 0;.  while( p
ba90: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
baa0: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
bab0: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62  ct->pPrior;.  db
bac0: 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46  ->flags = savedF
bad0: 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73  lags;.  pTab = s
bae0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
baf0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
bb00: 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
bb10: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
bb20: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
bb30: 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c  The sqlite3Resul
bb40: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69  tSetOfSelect() i
bb50: 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f  s only used n co
bb60: 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f  ntexts where loo
bb70: 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64  kaside.  ** is d
bb80: 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73  isabled */.  ass
bb90: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
bba0: 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29  de.bEnabled==0 )
bbb0: 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d  ;.  pTab->nRef =
bbc0: 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
bbd0: 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e  e = 0;.  pTab->n
bbe0: 52 6f 77 45 73 74 20 3d 20 31 30 30 30 30 30 30  RowEst = 1000000
bbf0: 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  ;.  selectColumn
bc00: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
bc10: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
bc20: 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
bc30: 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
bc40: 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c  ;.  selectAddCol
bc50: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
bc60: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
bc70: 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43  ->nCol, pTab->aC
bc80: 6f 6c 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  ol, pSelect);.  
bc90: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
bca0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
bcb0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
bcc0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
bcd0: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
bce0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
bcf0: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
bd00: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
bd10: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
bd20: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
bd30: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
bd40: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
bd50: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
bd60: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
bd70: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
bd80: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
bd90: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
bda0: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
bdb0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
bdc0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
bdd0: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
bde0: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
bdf0: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
be00: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
be10: 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64  arse->db);.#ifnd
be20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
be30: 52 41 43 45 0a 20 20 20 20 69 66 28 20 76 20 29  RACE.    if( v )
be40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
be50: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
be60: 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65  Trace);.    }.#e
be70: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
be80: 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  n v;.}.../*.** C
be90: 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
bea0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
beb0: 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
bec0: 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
bed0: 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  ** pLimit and pO
bee0: 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  ffset expression
bef0: 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  s.  pLimit and p
bf00: 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20  Offset hold the 
bf10: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
bf20: 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
bf30: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
bf40: 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
bf50: 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
bf60: 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
bf70: 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f    Or NULL if tho
bf80: 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
bf90: 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20  omitted. iLimit 
bfa0: 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20  and iOffset .** 
bfb0: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
bfc0: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
bfd0: 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e  numbers for coun
bfe0: 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
bff0: 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d  pute .** the lim
c000: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
c010: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
c020: 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
c030: 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69  et, then .** iLi
c040: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
c050: 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
c060: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c070: 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
c080: 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e  ues of iLimit an
c090: 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
c0a0: 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
c0b0: 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
c0c0: 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20  d by pLimit and 
c0d0: 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74  pOffset.  iLimit
c0e0: 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20   and.** iOffset 
c0f0: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
c100: 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
c110: 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
c120: 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c  alues.** (usuall
c130: 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73  y but not always
c140: 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61   -1) prior to ca
c150: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
c160: 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70  ne..** Only if p
c170: 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66  Limit!=0 or pOff
c180: 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  set!=0 do the li
c190: 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
c1a0: 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
c1b0: 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
c1c0: 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
c1d0: 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
c1e0: 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
c1f0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
c200: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
c210: 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
c220: 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
c230: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
c240: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
c250: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
c260: 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
c270: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
c280: 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
c290: 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
c2a0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
c2b0: 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
c2c0: 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20  addr1, n;.  if( 
c2d0: 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75  p->iLimit ) retu
c2e0: 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  rn;..  /* .  ** 
c2f0: 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79  "LIMIT -1" alway
c300: 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73  s shows all rows
c310: 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65  .  There is some
c320: 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73  .  ** contravers
c330: 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65  y about what the
c340: 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
c350: 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a  r should be..  *
c360: 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d  * The current im
c370: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
c380: 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30  erprets "LIMIT 0
c390: 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e  " to mean.  ** n
c3a0: 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73  o rows..  */.  s
c3b0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
c3c0: 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
c3d0: 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
c3e0: 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d  et==0 || p->pLim
c3f0: 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  it!=0 );.  if( p
c400: 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
c410: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  p->iLimit = iLim
c420: 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
c430: 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c  Mem;.    v = sql
c440: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
c450: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  se);.    if( NEV
c460: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
c470: 6e 3b 20 20 2f 2a 20 56 44 42 45 20 73 68 6f 75  n;  /* VDBE shou
c480: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
c490: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
c4a0: 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
c4b0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
c4c0: 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b  ->pLimit, &n) ){
c4d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c4e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c4f0: 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69  nteger, n, iLimi
c500: 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
c510: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
c520: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
c530: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
c540: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c550: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
c560: 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b  oto, 0, iBreak);
c570: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c580: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
c590: 6c 65 63 74 52 6f 77 20 3e 20 28 64 6f 75 62 6c  lectRow > (doubl
c5a0: 65 29 6e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  e)n ) p->nSelect
c5b0: 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 6e 3b  Row = (double)n;
c5c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
c5d0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
c5e0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
c5f0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69  , p->pLimit, iLi
c600: 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mit);.      sqli
c610: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
c620: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
c630: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64  Limit);.      Vd
c640: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
c650: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
c660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c670: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c680: 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69  fZero, iLimit, i
c690: 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  Break);.    }.  
c6a0: 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
c6b0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   ){.      p->iOf
c6c0: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
c6d0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
c6e0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
c6f0: 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f  Mem++;   /* Allo
c700: 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65  cate an extra re
c710: 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74  gister for limit
c720: 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  +offset */.     
c730: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c740: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
c750: 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  set, iOffset);. 
c760: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c770: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
c780: 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29  tBeInt, iOffset)
c790: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
c7a0: 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20  ent((v, "OFFSET 
c7b0: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
c7c0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
c7d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c7e0: 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74  P_IfPos, iOffset
c7f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c800: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c810: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66  _Integer, 0, iOf
c820: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
c830: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c840: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
c850: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c860: 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69  Op3(v, OP_Add, i
c870: 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20  Limit, iOffset, 
c880: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
c890: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
c8a0: 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
c8b0: 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  ));.      addr1 
c8c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c8d0: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
c8e0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
c8f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c900: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
c910: 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b   -1, iOffset+1);
c920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c930: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
c940: 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dr1);.    }.  }.
c950: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
c960: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
c970: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
c980: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
c990: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
c9a0: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
c9b0: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
c9c0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
c9d0: 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
c9e0: 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
c9f0: 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
ca00: 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
ca10: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
ca20: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
ca30: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
ca40: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
ca50: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
ca60: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
ca70: 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
ca80: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
ca90: 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
caa0: 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
cab0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
cac0: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
cad0: 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
cae0: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
caf0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
cb00: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
cb10: 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
cb20: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
cb30: 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
cb40: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
cb50: 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
cb60: 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
cb70: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
cb80: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f   }.  assert( iCo
cb90: 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  l>=0 );.  if( pR
cba0: 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d  et==0 && iCol<p-
cbb0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
cbc0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
cbd0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
cbe0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
cbf0: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
cc00: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
cc10: 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pRet;.}.#endif /
cc20: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
cc30: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
cc40: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
cc50: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
cc60: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
cc70: 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
cc80: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
cc90: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
cca0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
ccb0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
ccc0: 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
ccd0: 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
cce0: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
ccf0: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
cd00: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
cd10: 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
cd20: 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e  lts */.);...#ifn
cd30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cd40: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
cd50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
cd60: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
cd70: 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75  process a compou
cd80: 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72  nd query form fr
cd90: 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72  om.** two or mor
cda0: 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
cdb0: 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20  es using UNION, 
cdc0: 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50  UNION ALL, EXCEP
cdd0: 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45  T, or.** INTERSE
cde0: 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  CT.**.** "p" poi
cdf0: 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
ce00: 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
ce10: 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
ce20: 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
ce30: 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
ce40: 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
ce50: 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
ce60: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
ce70: 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
ce80: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
ce90: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
cea0: 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
ceb0: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
cec0: 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
ced0: 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
cee0: 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
cef0: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
cf00: 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
cf10: 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
cf20: 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
cf30: 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
cf40: 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
cf50: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
cf60: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
cf70: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
cf80: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
cf90: 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
cfa0: 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
cfb0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
cfc0: 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
cfd0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
cfe0: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
cff0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
d000: 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
d010: 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
d020: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
d050: 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
d060: 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
d070: 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
d080: 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
d090: 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
d0a0: 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
d0b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d0c0: 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
d0d0: 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
d0e0: 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
d0f0: 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
d100: 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
d110: 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
d120: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
d130: 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
d140: 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
d150: 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
d160: 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
d170: 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
d180: 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
d190: 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
d1a0: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
d1b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
d1c0: 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
d1d0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d1e0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d1f0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
d200: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
d210: 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
d220: 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
d230: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
d240: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
d250: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
d260: 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
d270: 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
d280: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d290: 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
d2a0: 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
d2b0: 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
d2c0: 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
d2d0: 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
d2e0: 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
d2f0: 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
d300: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
d310: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
d320: 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
d330: 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
d340: 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a  st dest;      /*
d350: 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74   Alternative dat
d360: 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  a destination */
d370: 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65  .  Select *pDele
d380: 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69  te = 0;  /* Chai
d390: 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65  n of simple sele
d3a0: 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  cts to delete */
d3b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
d3c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
d3d0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
d3e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
d3f0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
d400: 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20   int iSub1;     
d410: 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
d420: 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75   of left-hand qu
d430: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ery */.  int iSu
d440: 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b2;            /
d450: 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68  * EQP id of righ
d460: 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
d470: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
d480: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
d490: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
d4a0: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
d4b0: 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
d4c0: 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
d4d0: 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
d4e0: 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
d4f0: 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
d500: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
d510: 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  T..  */.  assert
d520: 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ( p && p->pPrior
d530: 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20   );  /* Calling 
d540: 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
d550: 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f  ees this much */
d560: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
d570: 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
d580: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
d590: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
d5a0: 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29  htmost!=pPrior )
d5b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
d5c0: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d  or->pRightmost==
d5d0: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b  p->pRightmost );
d5e0: 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
d5f0: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
d600: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
d610: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
d620: 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59  pParse,"ORDER BY
d630: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
d640: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
d650: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
d660: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
d670: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
d680: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
d690: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
d6a0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
d6b0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
d6c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d6d0: 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
d6e0: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
d6f0: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
d700: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
d710: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
d720: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
d730: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d740: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20  t_end;.  }..  v 
d750: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
d760: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
d770: 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20  rt( v!=0 );  /* 
d780: 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79  The VDBE already
d790: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
d7a0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
d7b0: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
d7c0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
d7d0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
d7e0: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
d7f0: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
d800: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
d810: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
d820: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
d830: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d840: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
d850: 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72  ral, dest.iSDPar
d860: 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  m, p->pEList->nE
d870: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
d880: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
d890: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
d8a0: 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73  );.    dest.eDes
d8b0: 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20  t = SRT_Table;. 
d8c0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
d8d0: 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69  re all SELECTs i
d8e0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
d8f0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
d900: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
d910: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72  .  ** in their r
d920: 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f  esult sets..  */
d930: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
d940: 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e  List && pPrior->
d950: 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20  pEList );.  if( 
d960: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
d970: 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  !=pPrior->pEList
d980: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69  ->nExpr ){.    i
d990: 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
d9a0: 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20   SF_Values ){.  
d9b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
d9c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c  Msg(pParse, "all
d9d0: 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76   VALUES must hav
d9e0: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
d9f0: 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20  r of terms");.  
da00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
da10: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
da20: 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
da30: 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
da40: 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
da50: 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61       " do not ha
da60: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
da70: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
da80: 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e  umns", selectOpN
da90: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
daa0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20   }.    rc = 1;. 
dab0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
dac0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
dad0: 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c   /* Compound SEL
dae0: 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20 61  ECTs that have a
daf0: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
db00: 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  e are handled se
db10: 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  parately..  */. 
db20: 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
db30: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d   ){.    return m
db40: 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
db50: 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  y(pParse, p, pDe
db60: 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  st);.  }..  /* G
db70: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
db80: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
db90: 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
dba0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  ments..  */.  sw
dbb0: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
dbc0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
dbd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
dbe0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
dbf0: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73  nLimit;.      as
dc00: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
dc10: 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
dc20: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
dc30: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
dc40: 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74   pPrior->pOffset
dc50: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
dc60: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
dc70: 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
dc80: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
dc90: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
dca0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
dcb0: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
dcc0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  dest);.      p->
dcd0: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
dce0: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
dcf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
dd00: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
dd10: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
dd20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
dd30: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
dd40: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
dd50: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
dd60: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
dd70: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
dd80: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  et;.      if( p-
dd90: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
dda0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
ddb0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
ddc0: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
ddd0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64  mit);.        Vd
dde0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a  beComment((v, "J
ddf0: 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d  ump ahead if LIM
de00: 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20  IT reached"));. 
de10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
de20: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
de30: 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
de40: 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
de50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
de60: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
de70: 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
de80: 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
de90: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
dea0: 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
deb0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
dec0: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
ded0: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
dee0: 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
def0: 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
df00: 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
df10: 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71  mit.       && sq
df20: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
df30: 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
df40: 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20  t, &nLimit).    
df50: 20 20 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74     && p->nSelect
df60: 52 6f 77 20 3e 20 28 64 6f 75 62 6c 65 29 6e 4c  Row > (double)nL
df70: 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20  imit .      ){. 
df80: 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
df90: 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 6e  tRow = (double)n
dfa0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Limit;.      }. 
dfb0: 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
dfc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dfd0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
dfe0: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
dff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e000: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
e010: 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
e020: 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
e030: 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
e040: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
e050: 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
e060: 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
e070: 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
e080: 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
e090: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
e0a0: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
e0b0: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
e0c0: 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
e0d0: 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
e0e0: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
e0f0: 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
e100: 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
e110: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
e120: 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
e130: 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
e140: 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
e150: 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
e160: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
e170: 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
e180: 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74  ondest;..      t
e190: 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
e1a0: 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20  TK_EXCEPT );.   
e1b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
e1c0: 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
e1d0: 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
e1e0: 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
e1f0: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
e200: 3d 70 72 69 6f 72 4f 70 20 26 26 20 41 4c 57 41  =priorOp && ALWA
e210: 59 53 28 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26  YS(!p->pLimit &&
e220: 21 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a  !p->pOffset) ){.
e230: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
e240: 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
e250: 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
e260: 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
e270: 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
e280: 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
e290: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
e2a0: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  rt( p->pRightmos
e2b0: 74 21 3d 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20  t!=p );  /* Can 
e2c0: 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 72 20  only happen for 
e2d0: 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
e2e0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 33         ** of a 3
e310: 2d 77 61 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d  -way or more com
e320: 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  pound */.       
e330: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d   assert( p->pLim
e340: 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  it==0 );      /*
e350: 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
e360: 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
e370: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  s */.        ass
e380: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
e390: 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74  =0 );     /* Not
e3a0: 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74   allowed on left
e3b0: 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  ward elements */
e3c0: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
e3d0: 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  b = dest.iSDParm
e3e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e3f0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c         /* We wil
e400: 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  l need to create
e410: 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61   our own tempora
e420: 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64  ry table to hold
e430: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
e440: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
e450: 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ults..        */
e460: 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61  .        unionTa
e470: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
e480: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
e490: 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
e4a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64  =0 );.        ad
e4b0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
e4c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
e4d0: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f  nEphemeral, unio
e4e0: 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
e4f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
e500: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
e510: 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  -1 );.        p-
e520: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
e530: 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20   = addr;.       
e540: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e   p->pRightmost->
e550: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
e560: 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
e570: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
e580: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
e590: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
e5a0: 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
e5b0: 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
e5c0: 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
e5d0: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
e5e0: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a  or->pOrderBy );.
e5f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
e600: 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69  ectDestInit(&uni
e610: 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c  ondest, priorOp,
e620: 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20   unionTab);.    
e630: 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
e640: 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
e650: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
e660: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
e670: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
e680: 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69  se, pPrior, &uni
e690: 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69  ondest);.      i
e6a0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
e6b0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
e6c0: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
e6d0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
e6e0: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
e6f0: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
e700: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
e710: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
e720: 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
e730: 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20  SRT_Except;.    
e740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e750: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
e760: 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
e770: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69      op = SRT_Uni
e780: 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  on;.      }.    
e790: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
e7a0: 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
e7b0: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
e7c0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
e7d0: 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
e7e0: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
e7f0: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
e800: 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73  ;.      uniondes
e810: 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
e820: 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
e830: 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
e840: 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
e850: 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
e860: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
e870: 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
e880: 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
e890: 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
e8a0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  _OK );.      /* 
e8b0: 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
e8c0: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
e8d0: 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
e8e0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
e8f0: 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74      ** Be sure t
e900: 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64  o delete p->pOrd
e910: 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c  erBy, therefore,
e920: 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f   to avoid a memo
e930: 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20  ry leak. */.    
e940: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
e950: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
e960: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
e970: 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
e980: 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
e990: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
e9a0: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
e9b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
e9c0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
e9d0: 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
e9e0: 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
e9f0: 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  ctRow;.      sql
ea00: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
ea10: 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
ea20: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
ea30: 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
ea40: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
ea50: 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  set;.      p->iL
ea60: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
ea70: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
ea80: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
ea90: 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  t the data in th
eaa0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
eab0: 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
eac0: 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74  form.      ** it
ead0: 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
eae0: 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
eaf0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
eb00: 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73  t( unionTab==des
eb10: 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73  t.iSDParm || des
eb20: 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
eb30: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65   );.      if( de
eb40: 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
eb50: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
eb60: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
eb70: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  iStart;.        
eb80: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
eb90: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
eba0: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
ebb0: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
ebc0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69       Select *pFi
ebd0: 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rst = p;.       
ebe0: 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
ebf0: 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
ec00: 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
ec10: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  or;.          ge
ec20: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
ec30: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
ec40: 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
ec50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ec60: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
ec70: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ec80: 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
ec90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
eca0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
ecb0: 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
ecc0: 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
ecd0: 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
ece0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ecf0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
ed00: 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
ed10: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
ed20: 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
ed30: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
ed40: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65  v);.        sele
ed50: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
ed60: 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
ed70: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70  , unionTab, p->p
ed80: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20  EList->nExpr,.  
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eda0: 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65        0, -1, &de
edb0: 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
edc0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
edd0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
ede0: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
edf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ee00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
ee10: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
ee20: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
ee30: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
ee40: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
ee50: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
ee60: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ee70: 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
ee80: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Tab, 0);.      }
ee90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
eea0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
eeb0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
eec0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
eed0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
eee0: 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
eef0: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
ef00: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
ef10: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
ef20: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
ef30: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
ef40: 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
ef50: 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
ef60: 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
ef70: 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
ef80: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
ef90: 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
efa0: 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
efb0: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
efc0: 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
efd0: 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
efe0: 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
eff0: 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
f000: 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
f010: 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
f020: 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
f030: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
f040: 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
f050: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
f060: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
f070: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  rderBy==0 );..  
f080: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
f090: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f0a0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
f0b0: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
f0c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
f0d0: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
f0e0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
f0f0: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
f100: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
f110: 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46  pRightmost->selF
f120: 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
f130: 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
f140: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
f150: 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
f160: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
f170: 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
f180: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
f190: 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
f1a0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
f1b0: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
f1c0: 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
f1d0: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
f1e0: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
f1f0: 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
f200: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
f210: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
f220: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
f230: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
f240: 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
f250: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
f260: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
f270: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
f280: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
f290: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
f2a0: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
f2b0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
f2c0: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
f2d0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
f2e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f2f0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
f300: 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
f310: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
f320: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
f330: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
f340: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
f350: 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
f360: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
f370: 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
f380: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
f390: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
f3a0: 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
f3b0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
f3c0: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
f3d0: 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
f3e0: 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32  t.iSDParm = tab2
f3f0: 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
f400: 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
f410: 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
f420: 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
f430: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
f440: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e  t(pParse, p, &in
f450: 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
f460: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
f470: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
f480: 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
f490: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
f4a0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
f4b0: 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
f4c0: 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69  >nSelectRow>pPri
f4d0: 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
f4e0: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
f4f0: 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
f500: 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
f510: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
f520: 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
f530: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
f540: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
f550: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
f560: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  t;..      /* Gen
f570: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
f580: 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
f590: 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
f5a0: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
f5b0: 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
f5c0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
f5d0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
f5e0: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
f5f0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
f600: 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  {.        Select
f610: 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
f620: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
f630: 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
f640: 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
f650: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67  Prior;.        g
f660: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
f670: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
f680: 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
f690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72       }.      iBr
f6a0: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
f6b0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
f6c0: 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
f6d0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
f6e0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70  l(v);.      comp
f6f0: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
f700: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
f710: 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
f720: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f730: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31   OP_Rewind, tab1
f740: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
f750: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
f760: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
f770: 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
f780: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f790: 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20  2(v, OP_RowKey, 
f7a0: 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  tab1, r1);.     
f7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f7c0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
f7d0: 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
f7e0: 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  t, r1, 0);.     
f7f0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
f800: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
f810: 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  1);.      select
f820: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
f830: 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
f840: 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  tab1, p->pEList-
f850: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
f870: 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e   -1, &dest, iCon
f880: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
f890: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
f8a0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
f8b0: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
f8c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f8d0: 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69  OP_Next, tab1, i
f8e0: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Start);.      sq
f8f0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
f900: 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
f910: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f920: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f930: 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b  Close, tab2, 0);
f940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f950: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
f960: 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a  lose, tab1, 0);.
f970: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f980: 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69   }.  }..  explai
f990: 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73  nComposite(pPars
f9a0: 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c  e, p->op, iSub1,
f9b0: 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54   iSub2, p->op!=T
f9c0: 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f  K_ALL);..  /* Co
f9d0: 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  mpute collating 
f9e0: 73 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62  sequences used b
f9f0: 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  y .  ** temporar
fa00: 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20  y tables needed 
fa10: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
fa20: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
fa30: 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68  ..  ** Attach th
fa40: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
fa50: 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f  ure to all tempo
fa60: 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a  rary tables..  *
fa70: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74  *.  ** This sect
fa80: 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68  ion is run by th
fa90: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c  e right-most SEL
faa0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
fab0: 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ly..  ** SELECT 
fac0: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68  statements to th
fad0: 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b  e left always sk
fae0: 69 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54  ip this part.  T
faf0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
fb00: 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20  ** SELECT might 
fb10: 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70  also skip this p
fb20: 61 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f  art if it has no
fb30: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
fb40: 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d   and.  ** no tem
fb50: 70 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71  p tables are req
fb60: 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  uired..  */.  if
fb70: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
fb80: 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
fb90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   ){.    int i;  
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbb0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
fbc0: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79  unter */.    Key
fbd0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
fbe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
fbf0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
fc00: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
fc10: 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63  set */.    Selec
fc20: 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20  t *pLoop;       
fc30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
fc40: 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
fc50: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fc60: 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  s */.    CollSeq
fc70: 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20   **apColl;      
fc80: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
fc90: 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b  oping through pK
fca0: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20  eyInfo->aColl[] 
fcb0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b  */.    int nCol;
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
fce0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  f columns in res
fcf0: 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20  ult set */..    
fd00: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
fd10: 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20  tmost==p );.    
fd20: 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
fd30: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65  ->nExpr;.    pKe
fd40: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  yInfo = sqlite3D
fd50: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a  bMallocZero(db,.
fd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd70: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
fd80: 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28 73  KeyInfo)+nCol*(s
fd90: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20  izeof(CollSeq*) 
fda0: 2b 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21  + 1));.    if( !
fdb0: 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
fdc0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
fdd0: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
fde0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
fdf0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65  ;.    }..    pKe
fe00: 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43  yInfo->enc = ENC
fe10: 28 64 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e  (db);.    pKeyIn
fe20: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  fo->nField = (u1
fe30: 36 29 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72  6)nCol;..    for
fe40: 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65  (i=0, apColl=pKe
fe50: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c  yInfo->aColl; i<
fe60: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c  nCol; i++, apCol
fe70: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43  l++){.      *apC
fe80: 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
fe90: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
fea0: 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   p, i);.      if
feb0: 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a  ( 0==*apColl ){.
fec0: 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
fed0: 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
fee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fef0: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f     pKeyInfo->aSo
ff00: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 61  rtOrder = (u8*)a
ff10: 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  pColl;..    for(
ff20: 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
ff30: 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
ff40: 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ior){.      for(
ff50: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
ff60: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
ff70: 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70   = pLoop->addrOp
ff80: 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20  enEphm[i];.     
ff90: 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b     if( addr<0 ){
ffa0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
ffb0: 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74   [0] is unused t
ffc0: 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20  hen [1] is also 
ffd0: 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63  unused.  So we c
ffe0: 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  an.          ** 
fff0: 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62  always safely ab
10000 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ort as soon as t
10010 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20  he first unused 
10020 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f  slot is found */
10030 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
10040 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70  t( pLoop->addrOp
10050 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20  enEphm[1]<0 );. 
10060 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
10070 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10080 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
10090 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e  ngeP2(v, addr, n
100a0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
100b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
100c0 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  4(v, addr, (char
100d0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
100e0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
100f0 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
10100 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[i] = -1;.  
10110 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
10120 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
10130 2c 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  , pKeyInfo);.  }
10140 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  ..multi_select_e
10150 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64  nd:.  pDest->iSd
10160 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  st = dest.iSdst;
10170 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
10180 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20  = dest.nSdst;.  
10190 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
101a0 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29  ete(db, pDelete)
101b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
101c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
101d0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
101e0 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SELECT */../*.**
101f0 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20   Code an output 
10200 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  subroutine for a
10210 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65   coroutine imple
10220 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a  mentation of a.*
10230 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e  * SELECT statmen
10240 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74  t..**.** The dat
10250 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69  a to be output i
10260 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70  s contained in p
10270 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72  In->iSdst.  Ther
10280 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53  e are.** pIn->nS
10290 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62  dst columns to b
102a0 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74  e output.  pDest
102b0 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75   is where the ou
102c0 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  tput should.** b
102d0 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65  e sent..**.** re
102e0 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e  gReturn is the n
102f0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67  umber of the reg
10300 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
10310 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20  e subroutine.** 
10320 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a  return address..
10330 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76  **.** If regPrev
10340 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  >0 then it is th
10350 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
10360 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61   in a vector tha
10370 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65  t.** records the
10380 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
10390 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20  .  mem[regPrev] 
103a0 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  is a flag that i
103b0 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68  s false.** if th
103c0 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20  ere has been no 
103d0 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
103e0 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74    If regPrev>0 t
103f0 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67  hen code is.** g
10400 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70  enerated to supp
10410 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e  ress duplicates.
10420 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73    pKeyInfo is us
10430 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  ed for comparing
10440 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  .** keys..**.** 
10450 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75  If the LIMIT fou
10460 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20  nd in p->iLimit 
10470 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70  is reached, jump
10480 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a   immediately to.
10490 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74  ** iBreak..*/.st
104a0 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74  atic int generat
104b0 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
104c0 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
104d0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
104e0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
104f0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10510 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
10520 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ment */.  Select
10530 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20  Dest *pIn,      
10540 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73    /* Coroutine s
10550 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f  upplying data */
10560 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
10570 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68  Dest,      /* Wh
10580 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20  ere to send the 
10590 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65  data */.  int re
105a0 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20  gReturn,        
105b0 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
105c0 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
105d0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
105e0 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v,            /*
105f0 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74   Previous result
10600 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75   register.  No u
10610 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a  niqueness if 0 *
10620 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
10630 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46  yInfo,      /* F
10640 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74  or comparing wit
10650 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  h previous entry
10660 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65   */.  int p4type
10670 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
10680 20 54 68 65 20 70 34 20 74 79 70 65 20 66 6f 72   The p4 type for
10690 20 70 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69   pKeyInfo */.  i
106a0 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
106b0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
106c0 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68  ere if we hit th
106d0 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20  e LIMIT */.){.  
106e0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
106f0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
10700 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20  Continue;.  int 
10710 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20  addr;..  addr = 
10720 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10730 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f  ntAddr(v);.  iCo
10740 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
10750 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
10760 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
10770 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20   duplicates for 
10780 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
10790 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20  nd INTERSECT .  
107a0 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76  */.  if( regPrev
107b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20   ){.    int j1, 
107c0 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c  j2;.    j1 = sql
107d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
107e0 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50  , OP_IfNot, regP
107f0 72 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73  rev);.    j2 = s
10800 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
10810 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
10820 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50  pIn->iSdst, regP
10830 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73  rev+1, pIn->nSds
10840 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
10850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10860 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
10870 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 20 20 73  , p4type);.    s
10880 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10890 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b  (v, OP_Jump, j2+
108a0 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32  2, iContinue, j2
108b0 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
108c0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
108d0 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  j1);.    sqlite3
108e0 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61  ExprCodeCopy(pPa
108f0 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
10900 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
10910 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 73 71 6c  >nSdst);.    sql
10920 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10930 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
10940 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20   regPrev);.  }. 
10950 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
10960 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
10970 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
10980 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69 72  Suppress the fir
10990 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65  st OFFSET entrie
109a0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  s if there is an
109b0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20   OFFSET clause. 
109c0 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74   */.  codeOffset
109d0 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65  (v, p, iContinue
109e0 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44  );..  switch( pD
109f0 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20  est->eDest ){.  
10a00 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
10a10 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
10a20 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
10a30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
10a40 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
10a50 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
10a60 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
10a70 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
10a80 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
10a90 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
10aa0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
10ab0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
10ac0 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d  testcase( pDest-
10ad0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c  >eDest==SRT_Tabl
10ae0 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
10af0 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ase( pDest->eDes
10b00 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
10b10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10b20 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10b30 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
10b40 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
10b50 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  dst, r1);.      
10b60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10b70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
10b80 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
10b90 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
10ba0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10bb0 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65  , OP_Insert, pDe
10bc0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c  st->iSDParm, r1,
10bd0 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
10be0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
10bf0 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
10c00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10c10 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
10c20 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
10c30 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
10c40 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
10c50 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
10c60 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
10c70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
10c80 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
10c90 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
10ca0 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
10cb0 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
10cc0 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
10cd0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
10ce0 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
10cf0 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
10d00 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
10d10 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
10d20 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
10d30 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
10d40 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
10d50 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
10d60 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
10d70 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
10d80 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst==1 );.     
10d90 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 0a   p->affinity = .
10da0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10db0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
10dc0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
10dd0 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66  pExpr, pDest->af
10de0 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20 72 31  fSdst);.      r1
10df0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
10e00 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
10e10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10e20 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
10e30 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
10e40 73 74 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61  st, 1, r1, &p->a
10e50 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
10e60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
10e70 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
10e80 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
10e90 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Sdst, 1);.      
10ea0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10eb0 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
10ec0 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
10ed0 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  m, r1);.      sq
10ee0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
10ef0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
10f00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10f10 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e    }..#if 0  /* N
10f20 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20 61  ever occurs on a
10f30 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65 72 79  n ORDER BY query
10f40 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   */.    /* If an
10f50 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
10f60 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
10f70 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
10f80 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
10f90 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
10fa0 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
10fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10fc0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
10fd0 31 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  1, pDest->iSDPar
10fe0 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
10ff0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
11000 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
11010 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
11020 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11030 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
11040 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
11050 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
11060 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
11070 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
11080 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
11090 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
110a0 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
110b0 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
110c0 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
110d0 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
110e0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
110f0 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
11100 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53   assert( pIn->nS
11110 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  dst==1 );.      
11120 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
11130 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
11140 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69  >iSdst, pDest->i
11150 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20  SDParm, 1);.    
11160 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
11170 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
11180 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
11190 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
111a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
111b0 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
111c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
111d0 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54  ERY */..    /* T
111e0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  he results are s
111f0 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
11200 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
11210 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
11220 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74   at pDest->iSdst
11230 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72  .  Then the co-r
11240 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20  outine yields.. 
11250 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
11260 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a  RT_Coroutine: {.
11270 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d        if( pDest-
11280 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20  >iSdst==0 ){.   
11290 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73       pDest->iSds
112a0 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
112b0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
112c0 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
112d0 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73       pDest->nSds
112e0 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a  t = pIn->nSdst;.
112f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
11300 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
11310 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
11320 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64  Sdst, pDest->iSd
11330 73 74 2c 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  st, pDest->nSdst
11340 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11350 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
11360 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
11370 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62  SDParm);.      b
11380 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
11390 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74   /* If none of t
113a0 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74  he above, then t
113b0 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e  he result destin
113c0 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20  ation must be.  
113d0 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e    ** SRT_Output.
113e0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
113f0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  s never called w
11400 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20  ith any other.  
11410 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e    ** destination
11420 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
11430 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f  ones handled abo
11440 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  ve or SRT_Output
11450 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
11460 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20  For SRT_Output, 
11470 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
11480 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
11490 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20   of registers.  
114a0 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  .    ** Then the
114b0 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70   OP_ResultRow op
114c0 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20  code is used to 
114d0 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74  cause sqlite3_st
114e0 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72  ep() to.    ** r
114f0 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72  eturn the next r
11500 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20  ow of result..  
11510 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
11520 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
11530 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
11540 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
11550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11560 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
11570 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73  ltRow, pIn->iSds
11580 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
11590 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
115a0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
115b0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
115c0 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
115d0 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dst);.      brea
115e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
115f0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
11600 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
11610 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
11620 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  eached..  */.  i
11630 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
11640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11650 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp3(v, OP_IfZe
11660 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69  ro, p->iLimit, i
11670 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a  Break, -1);.  }.
11680 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
11690 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
116a0 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
116b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
116c0 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65  bel(v, iContinue
116d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
116e0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
116f0 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  urn, regReturn);
11700 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ..  return addr;
11710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e  .}../*.** Altern
11720 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73  ative compound s
11730 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72  elect code gener
11740 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77  ator for cases w
11750 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hen there.** is 
11760 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
11770 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  se..**.** We ass
11780 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74  ume a query of t
11790 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
117a0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73  m:.**.**      <s
117b0 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74  electA>  <operat
117c0 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20  or>  <selectB>  
117d0 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62  ORDER BY <orderb
117e0 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70  ylist>.**.** <op
117f0 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f  erator> is one o
11800 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49  f UNION ALL, UNI
11810 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
11820 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69  NTERSECT.  The i
11830 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64  dea.** is to cod
11840 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e  e both <selectA>
11850 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77   and <selectB> w
11860 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
11870 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f   clause as.** co
11880 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e  -routines.  Then
11890 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74   run the co-rout
118a0 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c  ines in parallel
118b0 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72   and merge the r
118c0 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74  esults.** into t
118d0 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61  he output.  In a
118e0 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74  ddition to the t
118f0 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63  wo coroutines (c
11900 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e  alled selectA an
11910 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68  d.** selectB) th
11920 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75  ere are 7 subrou
11930 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tines:.**.**    
11940 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68  outA:    Move th
11950 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
11960 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e  selectA coroutin
11970 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
11980 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
11990 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
119a0 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20   query..**.**   
119b0 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74   outB:    Move t
119c0 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
119d0 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69   selectB corouti
119e0 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
119f0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
11a00 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
11a10 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20  d query.  (Only 
11a20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e  generated for UN
11a30 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ION and.**      
11a40 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
11a50 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e  .  EXCEPT and IN
11a60 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f  SERTSECT never o
11a70 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74  utput a row that
11a80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11a90 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20  appears only in 
11aa0 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74  B.).**.**    Alt
11ab0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
11ac0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
11ad0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
11ae0 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a  ines and A<B..**
11af0 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20  .**    AeqB:    
11b00 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
11b10 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
11b20 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
11b30 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20  nd A==B..**.**  
11b40 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65    AgtB:    Calle
11b50 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
11b60 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
11b70 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e  oroutines and A>
11b80 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41  B..**.**    EofA
11b90 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
11ba0 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
11bb0 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e  ed from selectA.
11bc0 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  .**.**    EofB: 
11bd0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
11be0 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
11bf0 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a   from selectB..*
11c00 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
11c10 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
11c20 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f  atter five subro
11c30 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e  utines depend on
11c40 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72   which .** <oper
11c50 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a  ator> is used:.*
11c60 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  *.**.**         
11c70 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20      UNION ALL   
11c80 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20        UNION     
11c90 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20         EXCEPT   
11ca0 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54         INTERSECT
11cb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  .**          ---
11cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
11cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
11ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
11cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d00 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75  .**   AltB:   ou
11d10 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
11d20 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
11d30 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
11d40 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a       nextA.**.**
11d50 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c     AeqB:   outA,
11d60 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
11d70 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20  extA            
11d80 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f   nextA         o
11d90 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a  utA, nextA.**.**
11da0 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c     AgtB:   outB,
11db0 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
11dc0 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
11dd0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
11de0 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20    nextB.**.**   
11df0 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65  EofA:   outB, ne
11e00 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
11e10 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61  extB          ha
11e20 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68  lt             h
11e30 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42  alt.**.**   EofB
11e40 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
11e50 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
11e60 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
11e70 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a  tA         halt.
11e80 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74  **.** In the Alt
11e90 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74  B, AeqB, and Agt
11ea0 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61  B subroutines, a
11eb0 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f  n EOF on A follo
11ec0 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61  wing nextA.** ca
11ed0 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  uses an immediat
11ee0 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61  e jump to EofA a
11ef0 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66  nd an EOF on B f
11f00 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63  ollowing nextB c
11f10 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65  auses.** an imme
11f20 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
11f30 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41  fB.  Within EofA
11f40 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45   and EofB, and E
11f50 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a  OF on entry or.*
11f60 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  * following next
11f70 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20  X causes a jump 
11f80 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
11f90 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  e select process
11fa0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69  ing..**.** Dupli
11fb0 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20  cate removal in 
11fc0 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  the UNION, EXCEP
11fd0 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
11fe0 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65   cases is handle
11ff0 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
12000 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
12010 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20  e.  The regPrev 
12020 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c  register set hol
12030 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ds the previousl
12040 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75  y.** output valu
12050 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e  e.  A comparison
12060 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74   is made against
12070 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20   this value and 
12080 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73  the output.** is
12090 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
120a0 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75  next results wou
120b0 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ld be the same a
120c0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a  s the previous..
120d0 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
120e0 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73  entation plan is
120f0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
12100 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
12110 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75   and seven.** su
12120 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c  broutines first,
12130 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f   then put the co
12140 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74  ntrol logic at t
12150 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65  he bottom.  Like
12160 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
12170 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a        goto Init.
12180 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f  **     coA: coro
12190 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71  utine for left q
121a0 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20  uery (A).**     
121b0 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coB: coroutine f
121c0 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28  or right query (
121d0 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f  B).**    outA: o
121e0 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
121f0 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f   A.**    outB: o
12200 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
12210 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e   B (UNION and UN
12220 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a  ION ALL only).**
12230 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a      EofA: ....**
12240 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a      EofB: ....**
12250 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a      AltB: ....**
12260 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a      AeqB: ....**
12270 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a      AgtB: ....**
12280 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61      Init: initia
12290 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72  lize coroutine r
122a0 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20  egisters.**     
122b0 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a       yield coA.*
122c0 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
122d0 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a  f(A) goto EofA.*
122e0 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
122f0 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20   coB.**         
12300 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20   if eof(B) goto 
12310 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a  EofB.**    Cmpr:
12320 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a   Compare A, B.**
12330 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41            Jump A
12340 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a  ltB, AeqB, AgtB.
12350 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a  **     End: ....
12360 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c  **.** We call Al
12370 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20  tB, AeqB, AgtB, 
12380 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22  EofA, and EofB "
12390 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74  subroutines" but
123a0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a   they are not.**
123b0 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64   actually called
123c0 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64   using Gosub and
123d0 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74   they do not Ret
123e0 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45  urn.  EofA and E
123f0 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69  ofB loop.** unti
12400 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78  l all data is ex
12410 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d  hausted then jum
12420 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c  p to the "end" l
12430 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42  abe.  AltB, AeqB
12440 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75  ,.** and AgtB ju
12450 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20  mp to either L2 
12460 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66  or to one of Eof
12470 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69  A or EofB..*/.#i
12480 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12490 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
124a0 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  T.static int mul
124b0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
124c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
124d0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
124e0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
124f0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
12500 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
12510 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
12520 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
12530 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
12540 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
12550 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
12560 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
12570 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
12580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
12590 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
125a0 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
125b0 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
125c0 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
125d0 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
125e0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
125f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
12600 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
12610 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
12620 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20  lectDest destA; 
12630 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
12640 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
12650 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65   A */.  SelectDe
12660 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a  st destB;     /*
12670 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
12680 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a   coroutine B */.
12690 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20    int regAddrA; 
126a0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
126b0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
126c0 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
126d0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45  ne */.  int regE
126e0 6f 66 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ofA;          /*
126f0 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74   Flag to indicat
12700 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 41 20  e when select-A 
12710 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20  is complete */. 
12720 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20   int regAddrB;  
12730 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
12740 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
12750 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
12760 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f  e */.  int regEo
12770 66 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fB;          /* 
12780 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65  Flag to indicate
12790 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 42 20 69   when select-B i
127a0 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  s complete */.  
127b0 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
127c0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
127d0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
127e0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
127f0 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
12800 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
12810 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
12820 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
12830 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
12840 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
12850 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
12860 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
12870 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
12880 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
12890 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
128a0 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
128b0 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
128c0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
128d0 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
128e0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
128f0 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
12900 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
12910 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  utB = 0;     /* 
12920 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
12930 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
12940 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
12950 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
12960 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
12970 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
12980 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
12990 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
129a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
129b0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
129c0 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
129d0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
129e0 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
129f0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
12a00 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B 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 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
12a30 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
12a40 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
12a50 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
12a60 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
12a70 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
12a80 3e 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 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
12aa0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
12ab0 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
12ac0 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
12ad0 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
12ae0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
12af0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
12b00 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
12b10 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
12b20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
12b30 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
12b40 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
12b50 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
12b60 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
12b70 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
12b80 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
12b90 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
12ba0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
12bb0 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
12bc0 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
12bd0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
12be0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
12bf0 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
12c00 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
12c10 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
12c20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
12c30 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
12c40 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
12c50 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20  */.  int j1;    
12c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
12c70 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
12c80 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
12c90 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
12ca0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12cb0 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
12cc0 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
12cd0 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
12ce0 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
12cf0 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
12d00 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
12d10 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
12d20 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
12d30 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
12d40 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
12d50 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
12d60 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
12d70 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
12d80 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
12d90 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
12da0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
12db0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
12dc0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
12dd0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
12de0 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
12df0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12e00 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
12e10 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
12e20 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
12e30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
12e40 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
12e50 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
12e60 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
12e70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12e80 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
12e90 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20  nt iSub1;       
12ea0 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
12eb0 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
12ec0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
12ed0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12ee0 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
12ef0 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
12f00 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
12f10 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29  p->pOrderBy!=0 )
12f20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
12f30 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61  Dup==0 ); /* "Ma
12f40 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64  naged" code need
12f50 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20  s this.  Ticket 
12f60 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d  #3382. */.  db =
12f70 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
12f80 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
12f90 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
12fa0 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72   );       /* Alr
12fb0 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20  eady thrown the 
12fc0 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c  error if VDBE al
12fd0 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
12fe0 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74  labelEnd = sqlit
12ff0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
13000 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20  v);.  labelCmpr 
13010 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
13020 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f  eLabel(v);...  /
13030 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f  * Patch up the O
13040 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
13050 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70   */.  op = p->op
13060 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  ;  .  pPrior = p
13070 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
13080 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  rt( pPrior->pOrd
13090 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72  erBy==0 );.  pOr
130a0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
130b0 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rBy;.  assert( p
130c0 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72  OrderBy );.  nOr
130d0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
130e0 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46  ->nExpr;..  /* F
130f0 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68  or operators oth
13100 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
13110 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b  L we have to mak
13120 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a  e sure that.  **
13130 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
13140 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72  ause covers ever
13150 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65  y term of the re
13160 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20  sult set.  Add. 
13170 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65   ** terms to the
13180 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
13190 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
131a0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b   */.  if( op!=TK
131b0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28  _ALL ){.    for(
131c0 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  i=1; db->mallocF
131d0 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70  ailed==0 && i<=p
131e0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
131f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
13200 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
13210 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
13220 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
13230 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f  OrderBy->a; j<nO
13240 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74  rderBy; j++, pIt
13250 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  em++){.        a
13260 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 4f  ssert( pItem->iO
13270 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20  rderByCol>0 );. 
13280 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
13290 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 69  ->iOrderByCol==i
132a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
132b0 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e  }.      if( j==n
132c0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
132d0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
132e0 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
132f0 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a  TK_INTEGER, 0);.
13300 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
13310 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
13320 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
13330 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
13340 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
13350 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69         pNew->u.i
13360 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20  Value = i;.     
13370 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71     pOrderBy = sq
13380 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
13390 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64  end(pParse, pOrd
133a0 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20  erBy, pNew);.   
133b0 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
133c0 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  y ) pOrderBy->a[
133d0 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 69 4f 72 64  nOrderBy++].iOrd
133e0 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69  erByCol = (u16)i
133f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13400 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
13410 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
13420 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64   permutation and
13430 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73   keyinfo that is
13440 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20   used with.  ** 
13450 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  the permutation 
13460 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
13470 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20  e if the next.  
13480 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  ** row of result
13490 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c  s comes from sel
134a0 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e  ectA or selectB.
134b0 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69    Also add expli
134c0 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  cit.  ** collati
134d0 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ons to the ORDER
134e0 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73   BY clause terms
134f0 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68   so that when th
13500 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a  e subqueries.  *
13510 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61  * to the right a
13520 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20  nd the left are 
13530 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20  evaluated, they 
13540 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  use the correct.
13550 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a    ** collation..
13560 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20    */.  aPermute 
13570 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
13580 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
13590 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a  int)*nOrderBy);.
135a0 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
135b0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
135c0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
135d0 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  m;.    for(i=0, 
135e0 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
135f0 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  a; i<nOrderBy; i
13600 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
13610 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
13620 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  m->iOrderByCol>0
13630 20 20 26 26 20 70 49 74 65 6d 2d 3e 69 4f 72 64    && pItem->iOrd
13640 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69  erByCol<=p->pELi
13650 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
13660 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d     aPermute[i] =
13670 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79   pItem->iOrderBy
13680 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20  Col - 1;.    }. 
13690 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20     pKeyMerge =. 
136a0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 4d 61       sqlite3DbMa
136b0 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
136c0 6f 66 28 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e  of(*pKeyMerge)+n
136d0 4f 72 64 65 72 42 79 2a 28 73 69 7a 65 6f 66 28  OrderBy*(sizeof(
136e0 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20  CollSeq*)+1));. 
136f0 20 20 20 69 66 28 20 70 4b 65 79 4d 65 72 67 65     if( pKeyMerge
13700 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65   ){.      pKeyMe
13710 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  rge->aSortOrder 
13720 3d 20 28 75 38 2a 29 26 70 4b 65 79 4d 65 72 67  = (u8*)&pKeyMerg
13730 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42  e->aColl[nOrderB
13740 79 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d 65  y];.      pKeyMe
13750 72 67 65 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75  rge->nField = (u
13760 31 36 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20  16)nOrderBy;.   
13770 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 65 6e     pKeyMerge->en
13780 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
13790 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
137a0 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
137b0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
137c0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45 78  Coll;.        Ex
137d0 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64  pr *pTerm = pOrd
137e0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
137f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
13800 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
13810 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  ExpCollate ){.  
13820 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
13830 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  pTerm->pColl;.  
13840 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13850 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d         pColl = m
13860 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
13870 71 28 70 50 61 72 73 65 2c 20 70 2c 20 61 50 65  q(pParse, p, aPe
13880 72 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20  rmute[i]);.     
13890 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67       pTerm->flag
138a0 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61  s |= EP_ExpColla
138b0 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54  te;.          pT
138c0 65 72 6d 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f  erm->pColl = pCo
138d0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ll;.        }.  
138e0 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
138f0 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
13900 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d  l;.        pKeyM
13910 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72  erge->aSortOrder
13920 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  [i] = pOrderBy->
13930 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
13940 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13950 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d  }else{.    pKeyM
13960 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erge = 0;.  }.. 
13970 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65   /* Reattach the
13980 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
13990 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20   to the query.. 
139a0 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42   */.  p->pOrderB
139b0 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
139c0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
139d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
139e0 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
139f0 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  , pOrderBy, 0);.
13a00 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
13a10 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
13a20 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
13a30 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
13a40 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
13a50 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
13a60 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
13a70 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
13a80 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
13a90 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
13aa0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
13ab0 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
13ac0 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
13ad0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
13ae0 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
13af0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
13b00 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
13b10 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
13b20 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
13b30 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  =nExpr || db->ma
13b40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
13b50 20 20 72 65 67 50 72 65 76 20 3d 20 73 71 6c 69    regPrev = sqli
13b60 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
13b70 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 31 29  pParse, nExpr+1)
13b80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13b90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
13ba0 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65  teger, 0, regPre
13bb0 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20  v);.    pKeyDup 
13bc0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
13bd0 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20  cZero(db,.      
13be0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
13bf0 6f 66 28 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e  of(*pKeyDup) + n
13c00 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  Expr*(sizeof(Col
13c10 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20  lSeq*)+1) );.   
13c20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a   if( pKeyDup ){.
13c30 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
13c40 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
13c50 29 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c  )&pKeyDup->aColl
13c60 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70  [nExpr];.      p
13c70 4b 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d  KeyDup->nField =
13c80 20 28 75 31 36 29 6e 45 78 70 72 3b 0a 20 20 20   (u16)nExpr;.   
13c90 20 20 20 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20     pKeyDup->enc 
13ca0 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20  = ENC(db);.     
13cb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
13cc0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
13cd0 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b   pKeyDup->aColl[
13ce0 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  i] = multiSelect
13cf0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
13d00 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70  p, i);.        p
13d10 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64  KeyDup->aSortOrd
13d20 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  er[i] = 0;.     
13d30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20   }.    }.  }. . 
13d40 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65   /* Separate the
13d50 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69   left and the ri
13d60 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f  ght query from o
13d70 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a  ne another.  */.
13d80 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
13d90 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
13da0 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
13db0 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
13dc0 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
13dd0 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50    if( pPrior->pP
13de0 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rior==0 ){.    s
13df0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
13e00 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
13e10 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72  , pPrior, pPrior
13e20 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
13e30 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ER");.  }..  /* 
13e40 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69  Compute the limi
13e50 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  t registers */. 
13e60 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
13e70 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
13e80 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69  , labelEnd);.  i
13e90 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20  f( p->iLimit && 
13ea0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
13eb0 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b    regLimitA = ++
13ec0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
13ed0 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b    regLimitB = ++
13ee0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
13ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13f00 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
13f10 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e  p->iOffset ? p->
13f20 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69  iOffset+1 : p->i
13f30 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
13f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f50 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69           regLimi
13f60 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
13f70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13f80 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41  _Copy, regLimitA
13f90 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20  , regLimitB);.  
13fa0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69  }else{.    regLi
13fb0 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42  mitA = regLimitB
13fc0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
13fd0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
13fe0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
13ff0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
14000 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
14010 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  te(db, p->pOffse
14020 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74  t);.  p->pOffset
14030 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72   = 0;..  regAddr
14040 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
14050 65 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d 20  em;.  regEofA = 
14060 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
14070 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70    regAddrB = ++p
14080 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
14090 65 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73  egEofB = ++pPars
140a0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
140b0 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
140c0 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d  Mem;.  regOutB =
140d0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
140e0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
140f0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c  DestInit(&destA,
14100 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
14110 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
14120 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
14130 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43  it(&destB, SRT_C
14140 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
14150 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  rB);..  /* Jump 
14160 70 61 73 74 20 74 68 65 20 76 61 72 69 6f 75 73  past the various
14170 20 73 75 62 72 6f 75 74 69 6e 65 73 20 61 6e 64   subroutines and
14180 20 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20 74   coroutines to t
14190 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72  he main.  ** mer
141a0 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a  ge loop.  */.  j
141b0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
141c0 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
141d0 29 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41  );.  addrSelectA
141e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
141f0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a  rrentAddr(v);...
14200 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
14210 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
14220 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
14230 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
14240 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74  e.  ** left of t
14250 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72  he compound oper
14260 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73  ator - the "A" s
14270 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64  elect..  */.  Vd
14280 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
14290 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69  , "Begin corouti
142a0 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45  ne for left SELE
142b0 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d  CT"));.  pPrior-
142c0 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
142d0 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65  itA;.  explainSe
142e0 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
142f0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
14300 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
14310 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14320 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b  pPrior, &destA);
14330 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14340 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
14350 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 41 29 3b  er, 1, regEofA);
14360 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14370 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
14380 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 56  , regAddrA);.  V
14390 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
143a0 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e  v, "End coroutin
143b0 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43  e for left SELEC
143c0 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  T"));..  /* Gene
143d0 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
143e0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
143f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
14400 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72  t on .  ** the r
14410 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73  ight - the "B" s
14420 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64  elect.  */.  add
14430 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74  rSelectB = sqlit
14440 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
14450 72 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  r(v);.  VdbeNoop
14460 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
14470 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  in coroutine for
14480 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29   right SELECT"))
14490 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d  ;.  savedLimit =
144a0 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61   p->iLimit;.  sa
144b0 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  vedOffset = p->i
144c0 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69  Offset;.  p->iLi
144d0 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b  mit = regLimitB;
144e0 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
144f0 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65  0;  .  explainSe
14500 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
14510 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
14520 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
14530 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14540 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d  p, &destB);.  p-
14550 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c  >iLimit = savedL
14560 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  imit;.  p->iOffs
14570 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74  et = savedOffset
14580 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
14590 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
145a0 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42 29  ger, 1, regEofB)
145b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
145c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
145d0 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
145e0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
145f0 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69  (v, "End corouti
14600 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c  ne for right SEL
14610 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65  ECT"));..  /* Ge
14620 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
14630 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
14640 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
14650 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73   of the A.  ** s
14660 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
14670 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
14680 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
14690 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
146a0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
146b0 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
146c0 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72  for A"));.  addr
146d0 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutA = generateO
146e0 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
146f0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
14700 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
14710 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tA, pDest, regOu
14720 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tA,.            
14730 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
14740 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46  eyDup, P4_KEYINF
14750 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65 6c  O_HANDOFF, label
14760 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65  End);.  .  /* Ge
14770 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
14780 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
14790 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
147a0 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73   of the B.  ** s
147b0 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78  elect as the nex
147c0 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20  t output row of 
147d0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
147e0 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ect..  */.  if( 
147f0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
14800 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
14810 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
14820 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
14830 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a  utine for B"));.
14840 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67      addrOutB = g
14850 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
14860 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73   p, &destB, pDes
14890 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20  t, regOutB,.    
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
148b0 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50  Prev, pKeyDup, P
148c0 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43  4_KEYINFO_STATIC
148d0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d  , labelEnd);.  }
148e0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
148f0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
14900 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
14910 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
14920 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   A.  ** are exha
14930 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
14940 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20  ata in select B 
14950 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
14960 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
14970 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f  (v, "eof-A subro
14980 75 74 69 6e 65 22 29 29 3b 0a 20 20 69 66 28 20  utine"));.  if( 
14990 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
149a0 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
149b0 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
149c0 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  A = sqlite3VdbeA
149d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
149e0 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  , 0, labelEnd);.
149f0 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 61    }else{  .    a
14a00 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65  ddrEofA = sqlite
14a10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14a20 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 6c  P_If, regEofB, l
14a30 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71  abelEnd);.    sq
14a40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14a50 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
14a60 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
14a70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14a80 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
14a90 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20  ld, regAddrB);. 
14aa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14ab0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
14ac0 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20   0, addrEofA);. 
14ad0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
14ae0 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
14af0 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  ectRow;.  }..  /
14b00 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
14b10 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
14b20 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
14b30 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20  from select B.  
14b40 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
14b50 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
14b60 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69  n select A remai
14b70 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
14b80 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
14b90 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  ){.    addrEofB 
14ba0 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20  = addrEofA;.    
14bb0 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
14bc0 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w > pPrior->nSel
14bd0 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c  ectRow ) p->nSel
14be0 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
14bf0 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
14c00 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
14c10 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
14c20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e  "eof-B subroutin
14c30 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
14c40 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fB = sqlite3Vdbe
14c50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
14c60 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45   regEofA, labelE
14c70 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nd);.    sqlite3
14c80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14c90 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
14ca0 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20   addrOutA);.    
14cb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14cc0 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
14cd0 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71  egAddrA);.    sq
14ce0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14cf0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
14d00 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20  ddrEofB);.  }.. 
14d10 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
14d20 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
14d30 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f  case of A<B.  */
14d40 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
14d50 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73  nt((v, "A-lt-B s
14d60 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
14d70 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74  addrAltB = sqlit
14d80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
14d90 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
14da0 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
14db0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14dc0 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
14dd0 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
14de0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14df0 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c   OP_If, regEofA,
14e00 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71   addrEofA);.  sq
14e10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14e20 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
14e30 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
14e40 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14e50 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
14e60 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20  e of A==B.  */. 
14e70 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
14e80 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
14e90 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65  = addrAltB;.  }e
14ea0 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
14eb0 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
14ec0 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
14ed0 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74  ltB;.    addrAlt
14ee0 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  B++;.  }else{.  
14ef0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
14f00 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75  t((v, "A-eq-B su
14f10 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
14f20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20   addrAeqB =.    
14f30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14f40 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
14f50 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71  egAddrA);.    sq
14f60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14f70 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
14f80 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  A, addrEofA);.  
14f90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14fa0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
14fb0 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  0, labelCmpr);. 
14fc0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
14fd0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
14fe0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42   the case of A>B
14ff0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
15000 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67  Comment((v, "A-g
15010 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
15020 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20  );.  addrAgtB = 
15030 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
15040 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
15050 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
15060 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
15070 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15080 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
15090 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
150a0 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  utB);.  }.  sqli
150b0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
150c0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
150d0 64 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  drB);.  sqlite3V
150e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
150f0 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64  If, regEofB, add
15100 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65  rEofB);.  sqlite
15110 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15120 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
15130 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  Cmpr);..  /* Thi
15140 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65  s code runs once
15150 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65   to initialize e
15160 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a  verything..  */.
15170 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
15180 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
15190 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
151a0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
151b0 20 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20   0, regEofA);.  
151c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
151d0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
151e0 20 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20   0, regEofB);.  
151f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15200 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
15210 65 67 41 64 64 72 41 2c 20 61 64 64 72 53 65 6c  egAddrA, addrSel
15220 65 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ectA);.  sqlite3
15230 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15240 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 42  _Gosub, regAddrB
15250 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a  , addrSelectB);.
15260 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15270 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
15280 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29  gEofA, addrEofA)
15290 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
152a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
152b0 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66  regEofB, addrEof
152c0 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d  B);..  /* Implem
152d0 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72  ent the main mer
152e0 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  ge loop.  */.  s
152f0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
15300 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43  eLabel(v, labelC
15310 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  mpr);.  sqlite3V
15320 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15330 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20  Permutation, 0, 
15340 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65  0, 0, (char*)aPe
15350 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52  rmute, P4_INTARR
15360 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  AY);.  sqlite3Vd
15370 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
15380 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53  ompare, destA.iS
15390 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74  dst, destB.iSdst
153a0 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , nOrderBy,.    
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
153d0 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46  Merge, P4_KEYINF
153e0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71  O_HANDOFF);.  sq
153f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15400 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
15410 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20  AltB, addrAeqB, 
15420 61 64 64 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a  addrAgtB);..  /*
15430 20 52 65 6c 65 61 73 65 20 74 65 6d 70 6f 72 61   Release tempora
15440 72 79 20 72 65 67 69 73 74 65 72 73 0a 20 20 2a  ry registers.  *
15450 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
15460 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
15470 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
15480 50 61 72 73 65 2c 20 72 65 67 50 72 65 76 2c 20  Parse, regPrev, 
15490 6e 4f 72 64 65 72 42 79 2b 31 29 3b 0a 20 20 7d  nOrderBy+1);.  }
154a0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
154b0 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
154c0 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
154d0 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
154e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
154f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15500 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
15510 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
15520 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d   of output colum
15530 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  ns.  */.  if( pD
15540 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
15550 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65  Output ){.    Se
15560 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
15570 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65  Prior;.    while
15580 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  ( pFirst->pPrior
15590 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72   ) pFirst = pFir
155a0 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  st->pPrior;.    
155b0 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
155c0 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
155d0 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
155e0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65    }..  /* Reasse
155f0 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e  mbly the compoun
15600 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20  d query so that 
15610 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
15620 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
15630 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
15640 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
15650 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
15660 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
15670 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72  elete(db, p->pPr
15680 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ior);.  }.  p->p
15690 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
156a0 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e  .  /*** TBD:  In
156b0 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20  sert subroutine 
156c0 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63  calls to close c
156d0 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70  ursors on incomp
156e0 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71  lete.  **** subq
156f0 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65  ueries ****/.  e
15700 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
15710 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69  pParse, p->op, i
15720 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b  Sub1, iSub2, 0);
15730 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15740 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
15750 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
15760 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
15770 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
15780 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
15790 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61  /* Forward Decla
157a0 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
157b0 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
157c0 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45  List(sqlite3*, E
157d0 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45  xprList*, int, E
157e0 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69  xprList*);.stati
157f0 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
15800 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c  ct(sqlite3*, Sel
15810 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72  ect *, int, Expr
15820 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  List *);../*.** 
15830 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
15840 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
15850 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
15860 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
15870 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
15880 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
15890 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
158a0 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
158b0 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
158c0 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
158d0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
158e0 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
158f0 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
15900 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15910 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
15920 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
15930 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
15940 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
15950 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
15960 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
15970 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
15980 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
15990 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
159a0 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
159b0 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
159c0 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
159d0 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
159e0 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
159f0 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65  routine make the
15a00 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63   necessary .** c
15a10 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20  hanges to pExpr 
15a20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72  so that it refer
15a30 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  s directly to th
15a40 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a  e source table.*
15a50 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
15a60 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73  y rather the res
15a70 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73  ult set of the s
15a80 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  ubquery..*/.stat
15a90 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45 78  ic Expr *substEx
15aa0 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pr(.  sqlite3 *d
15ab0 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70  b,        /* Rep
15ac0 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  ort malloc error
15ad0 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63  s to this connec
15ae0 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
15af0 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
15b00 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
15b10 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
15b20 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  rs */.  int iTab
15b30 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
15b40 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74  able to be subst
15b50 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  ituted */.  Expr
15b60 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
15b70 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65 78  /* Substitute ex
15b80 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  pressions */.){.
15b90 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
15ba0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
15bb0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
15bc0 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
15bd0 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29  iTable==iTable )
15be0 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
15bf0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
15c00 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
15c10 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
15c20 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
15c30 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65  pNew;.      asse
15c40 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26  rt( pEList!=0 &&
15c50 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
15c60 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
15c70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15c80 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
15c90 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
15ca0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  =0 );.      pNew
15cb0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
15cc0 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  p(db, pEList->a[
15cd0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
15ce0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
15cf0 20 69 66 28 20 70 4e 65 77 20 26 26 20 70 45 78   if( pNew && pEx
15d00 70 72 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  pr->pColl ){.   
15d10 20 20 20 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 6c       pNew->pColl
15d20 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b   = pExpr->pColl;
15d30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
15d40 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
15d50 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
15d60 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
15d70 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
15d80 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
15d90 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
15da0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69   pExpr->pLeft, i
15db0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
15dc0 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
15dd0 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
15de0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
15df0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
15e00 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
15e10 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
15e20 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
15e30 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
15e40 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78  ect(db, pExpr->x
15e50 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  .pSelect, iTable
15e60 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
15e70 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73  else{.      subs
15e80 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
15e90 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54  xpr->x.pList, iT
15ea0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
15eb0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15ec0 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
15ed0 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
15ee0 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
15ef0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
15f00 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
15f10 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
15f20 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
15f30 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
15f40 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
15f50 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
15f60 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
15f70 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
15f80 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
15f90 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
15fa0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
15fb0 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
15fc0 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
15fd0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
15fe0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
15ff0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
16000 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
16010 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
16020 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
16030 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  xpr(db, pList->a
16040 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
16050 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
16060 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
16070 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c  bstSelect(.  sql
16080 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
16090 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
160a0 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
160b0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
160c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
160d0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
160e0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
160f0 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
16100 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
16110 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
16120 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f  o be replaced */
16130 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
16140 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
16150 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
16160 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
16170 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
16180 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
16190 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
161a0 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
161b0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
161c0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
161d0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
161e0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
161f0 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  , p->pGroupBy, i
16200 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
16210 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
16220 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
16230 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16240 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d  ;.  p->pHaving =
16250 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
16260 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
16270 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d  e, pEList);.  p-
16280 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
16290 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  xpr(db, p->pWher
162a0 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  e, iTable, pELis
162b0 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63  t);.  substSelec
162c0 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  t(db, p->pPrior,
162d0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
162e0 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
162f0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
16300 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66  rc );  /* Even f
16310 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65  or (SELECT 1) we
16320 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62   have: pSrc!=0 b
16330 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  ut pSrc->nSrc==0
16340 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
16350 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f  (pSrc) ){.    fo
16360 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
16370 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
16380 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
16390 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
163a0 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lect(db, pItem->
163b0 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
163c0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   pEList);.    }.
163d0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
163e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
163f0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
16400 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
16410 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
16420 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
16430 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16440 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
16450 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
16460 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
16470 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
16480 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
16490 69 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d  ies as a perform
164a0 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
164b0 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
164c0 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  ne returns 1 if 
164d0 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
164e0 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
164f0 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a  ttening occurs..
16500 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
16510 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
16520 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
16530 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
16540 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
16550 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
16560 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
16570 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
16580 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
16590 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
165a0 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
165b0 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
165c0 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
165d0 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
165e0 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
165f0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
16600 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
16610 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
16620 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
16630 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
16640 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
16650 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
16660 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
16670 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
16680 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
16690 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
166a0 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
166b0 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
166c0 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
166d0 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
166e0 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
166f0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
16700 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
16710 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
16720 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
16730 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
16740 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
16750 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
16760 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
16770 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
16780 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
16790 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
167a0 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
167b0 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
167c0 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
167d0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
167e0 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
167f0 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
16800 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
16810 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
16820 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
16830 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
16840 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
16850 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
16860 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
16870 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
16880 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
16890 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
168a0 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
168b0 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
168c0 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
168d0 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
168e0 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
168f0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
16900 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
16910 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
16920 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
16930 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
16940 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
16950 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
16960 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
16970 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
16980 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a  ft outer join.**
16990 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61          (Origina
169a0 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e  lly ticket #306.
169b0 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62    Strengthened b
169c0 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a  y ticket #3300).
169d0 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
169e0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
169f0 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
16a00 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70    (**)  At one p
16a10 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e  oint restriction
16a20 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65  s (4) and (5) de
16a30 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f  fined a subset o
16a40 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20  f DISTINCT.**   
16a50 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73       sub-queries
16a60 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75   that were exclu
16a70 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70  ded from this op
16a80 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74  timization. Rest
16a90 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  riction .**     
16aa0 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65     (4) has since
16ab0 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74   been expanded t
16ac0 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49  o exclude all DI
16ad0 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65  STINCT subquerie
16ae0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
16af0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
16b00 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
16b10 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
16b20 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
16b30 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
16b40 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
16b50 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
16b60 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20   a FROM clause. 
16b70 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71   TODO:  For subq
16b80 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a  ueries without.*
16b90 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20  *        A FROM 
16ba0 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72  clause, consider
16bb0 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63   adding a FROM c
16bc0 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20 73 70  lose with the sp
16bd0 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ecial.**        
16be0 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63  table sqlite_onc
16bf0 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  e that consists 
16c00 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  of a single row 
16c10 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
16c20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55         single NU
16c30 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  LL..**.**   (8) 
16c40 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
16c50 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
16c60 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
16c70 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
16c80 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
16c90 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
16ca0 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
16cb0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
16cc0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
16cd0 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
16ce0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30  ates..**.**  (10
16cf0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
16d00 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
16d10 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
16d20 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
16d30 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
16d40 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
16d50 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
16d60 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
16d70 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
16d80 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
16d90 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
16da0 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (**)  Not imple
16db0 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
16dc0 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
16dd0 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
16de0 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
16df0 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
16e00 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
16e10 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
16e20 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
16e30 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
16e40 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  d outer query do
16e50 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
16e60 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  MIT..**.**  (14)
16e70 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
16e80 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  oes not use OFFS
16e90 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  ET..**.**  (15) 
16ea0 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
16eb0 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
16ec0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
16ed0 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  t or the.**     
16ee0 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73     subquery does
16ef0 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
16f00 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20  T clause..**    
16f10 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
16f20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74  #2339 and ticket
16f30 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a   [02a8e81d44])..
16f40 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65  **.**  (16)  The
16f50 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
16f60 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
16f70 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79   or the subquery
16f80 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20   does.**        
16f90 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  not contain ORDE
16fa0 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
16fb0 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
16fc0 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
16fd0 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
16fe0 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
16ff0 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
17000 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
17010 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62  *  (17)  The sub
17020 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  -query is not a 
17030 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
17040 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f   or it is a UNIO
17050 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20  N ALL .**       
17060 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65   compound clause
17070 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c   made up entirel
17080 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61  y of non-aggrega
17090 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20  te queries, and 
170a0 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70  .**        the p
170b0 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a  arent query:.**.
170c0 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
170d0 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74   not itself part
170e0 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
170f0 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20  elect,.**       
17100 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61     * is not an a
17110 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54  ggregate or DIST
17120 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a  INCT query, and.
17130 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
17140 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a   not a join.**.*
17150 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72  *        The par
17160 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72  ent and sub-quer
17170 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48  y may contain WH
17180 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62  ERE clauses. Sub
17190 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20  ject to.**      
171a0 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31    rules (11), (1
171b0 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65  3) and (14), the
171c0 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  y may also conta
171d0 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20  in ORDER BY,.** 
171e0 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64         LIMIT and
171f0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
17200 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63    The subquery c
17210 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f  annot use any co
17220 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
17230 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20   operator other 
17240 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62  than UNION ALL b
17250 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f  ecause all the o
17260 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a  ther compound.**
17270 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
17280 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65  s have an implie
17290 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68  d DISTINCT which
172a0 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62   is disallowed b
172b0 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74  y.**        rest
172c0 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a  riction (4)..**.
172d0 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20  **        Also, 
172e0 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  each component o
172f0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
17300 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  must return the 
17310 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20  same number.**  
17320 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20        of result 
17330 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73  columns. This is
17340 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75   actually a requ
17350 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20  irement for any 
17360 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
17370 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d     SELECT statem
17380 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  ent, but all the
17390 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20   code here does 
173a0 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  is make sure tha
173b0 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  t no.**        s
173c0 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75  uch (illegal) su
173d0 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74  b-query is flatt
173e0 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  ened. The caller
173f0 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65   will detect the
17400 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61  .**        synta
17410 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75  x error and retu
17420 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65  rn a detailed me
17430 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  ssage..**.**  (1
17440 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  8)  If the sub-q
17450 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
17460 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
17470 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
17480 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52  .**        ORDER
17490 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68   by clause of th
174a0 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65  e parent must be
174b0 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63   simple referenc
174c0 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20  es to .**       
174d0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
174e0 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  sub-query..**.**
174f0 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71    (19)  The subq
17500 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
17510 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
17520 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
17530 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  not.**        ha
17540 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ve a WHERE claus
17550 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20  e..**.**  (20)  
17560 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
17570 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
17580 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d  elect, then it m
17590 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  ust not use.**  
175a0 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42        an ORDER B
175b0 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65  Y clause.  Ticke
175c0 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75  t #3773.  We cou
175d0 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f  ld relax this co
175e0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20  nstraint.**     
175f0 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73     somewhat by s
17600 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74  aying that the t
17610 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
17620 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74  R BY clause must
17630 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61  .**        appea
17640 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20  r as unmodified 
17650 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69  result columns i
17660 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
17670 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20  y.  But we.**   
17680 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
17690 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
176a0 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
176b0 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
176c0 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73  .**  (21)  The s
176d0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
176e0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
176f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
17700 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
17710 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74  ISTINCT.  (See t
17720 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66  icket [752e1646f
17730 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  c])..**.** In th
17740 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
17750 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
17760 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
17770 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
17780 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
17790 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
177a0 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
177b0 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
177c0 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
177d0 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75  ggregates and su
177e0 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74  bqueryIsAgg is t
177f0 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
17800 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
17810 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
17820 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
17830 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
17840 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
17850 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
17860 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
17870 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
17880 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
17890 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
178a0 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
178b0 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
178c0 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
178d0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
178e0 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
178f0 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
17900 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
17910 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
17920 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50  tenSubquery(.  P
17930 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
17940 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
17950 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
17960 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
17970 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
17980 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
17990 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
179a0 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
179b0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
179c0 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
179d0 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
179e0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
179f0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
17a00 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
17a10 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
17a20 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
17a30 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
17a40 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
17a50 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
17a60 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
17a70 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
17a80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
17a90 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
17aa0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
17ab0 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  text;.  Select *
17ac0 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63  pParent;.  Selec
17ad0 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f  t *pSub;       /
17ae0 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  * The inner quer
17af0 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22 20  y or "subquery" 
17b00 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
17b10 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  b1;      /* Poin
17b20 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68 74  ter to the right
17b30 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73  most select in s
17b40 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  ub-query */.  Sr
17b50 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20  cList *pSrc;    
17b60 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
17b70 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
17b80 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63  r query */.  Src
17b90 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20  List *pSubSrc;  
17ba0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
17bb0 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
17bc0 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ery */.  ExprLis
17bd0 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  t *pList;    /* 
17be0 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  The result set o
17bf0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
17c00 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  y */.  int iPare
17c10 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44  nt;        /* VD
17c20 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
17c30 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73   of the pSub res
17c40 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62  ult set temp tab
17c50 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
17c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
17c70 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
17c80 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ca0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
17cb0 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
17cc0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
17cd0 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54  pSubitem;   /* T
17ce0 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
17cf0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
17d00 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
17d10 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
17d20 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
17d30 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72  ermitted.  Retur
17d40 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f  n 0 if not..  */
17d50 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
17d60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
17d70 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a  pPrior==0 );  /*
17d80 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74   Unable to flatt
17d90 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  en compound quer
17da0 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ies */.  if( db-
17db0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
17dc0 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 20 29  QueryFlattener )
17dd0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72   return 0;.  pSr
17de0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
17df0 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69  ssert( pSrc && i
17e00 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d  From>=0 && iFrom
17e10 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
17e20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72   pSubitem = &pSr
17e30 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69  c->a[iFrom];.  i
17e40 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65  Parent = pSubite
17e50 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53  m->iCursor;.  pS
17e60 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  ub = pSubitem->p
17e70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74  Select;.  assert
17e80 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69  ( pSub!=0 );.  i
17e90 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71  f( isAgg && subq
17ea0 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
17eb0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
17ec0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
17ed0 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69  tion (1)  */.  i
17ee0 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
17ef0 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31   && pSrc->nSrc>1
17f00 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
17f10 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
17f20 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70  tion (2)  */.  p
17f30 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
17f40 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
17f50 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50  SubSrc );.  /* P
17f60 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20  rior to version 
17f70 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49  3.1.2, when LIMI
17f80 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64  T and OFFSET had
17f90 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f   to be simple co
17fa0 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f  nstants,.  ** no
17fb0 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  t arbitrary expr
17fc0 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c  esssions, we all
17fd0 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e  owed some combin
17fe0 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64  ing of LIMIT and
17ff0 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
18000 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20  ause they could 
18010 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63  be computed at c
18020 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75  ompile-time.  Bu
18030 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  t when LIMIT and
18040 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
18050 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78  ame arbitrary ex
18060 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65  pressions, we we
18070 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64  re forced to add
18080 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31   restrictions (1
18090 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29  3).  ** and (14)
180a0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  . */.  if( pSub-
180b0 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c  >pLimit && p->pL
180c0 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
180e0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33   Restriction (13
180f0 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
18100 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72  >pOffset ) retur
18110 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18130 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34   Restriction (14
18140 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52  ) */.  if( p->pR
18150 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75 62  ightmost && pSub
18160 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
18170 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
18180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181a0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
181b0 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a  ion (15) */.  }.
181c0 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
181d0 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
181e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
181f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
18200 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a  riction (7)  */.
18210 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
18220 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
18230 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
18240 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
18250 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a  riction (5)  */.
18260 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
18270 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72  it && (pSrc->nSr
18280 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
18290 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
182a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
182b0 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a  ictions (8)(9) *
182c0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
182d0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
182e0 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75  stinct)!=0 && su
182f0 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
18300 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
18310 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
18320 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d  tion (6)  */.  }
18330 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
18340 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
18350 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
18360 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
18370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18390 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
183a0 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
183b0 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
183c0 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
183d0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
183e0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
183f0 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66  ion (16) */.  if
18400 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
18410 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  & p->pWhere ) re
18420 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
18430 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
18440 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66  ion (19) */.  if
18450 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
18460 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
18470 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
18480 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
18490 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
184a0 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a  striction (21) *
184b0 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f  /.  }..  /* OBSO
184c0 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a  LETE COMMENT 1:.
184d0 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    ** Restriction
184e0 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71   3:  If the subq
184f0 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20  uery is a join, 
18500 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
18510 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20  bquery is .  ** 
18520 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20  not used as the 
18530 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
18540 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20   an outer join. 
18550 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79   Examples of why
18560 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f   this.  ** is no
18570 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
18580 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
18590 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
185a0 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a  (t2 JOIN t3).  *
185b0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
185c0 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
185d0 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
185e0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
185f0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
18600 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20  IN t2) JOIN t3. 
18610 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69   **.  ** which i
18620 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65  s not at all the
18630 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a   same thing..  *
18640 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20  *.  ** OBSOLETE 
18650 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20  COMMENT 2:.  ** 
18660 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20  Restriction 12: 
18670 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
18680 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
18690 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
186a0 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c  outer.  ** join,
186b0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
186c0 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57  ubquery has no W
186d0 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a  HERE clause..  *
186e0 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66  * An examples of
186f0 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74   why this is not
18700 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
18710 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
18720 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
18730 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
18740 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20   WHERE t2.x>0). 
18750 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
18760 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
18770 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
18780 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
18790 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
187a0 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74  JOIN t2) WHERE t
187b0 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  2.x>0.  **.  ** 
187c0 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74  But the t2.x>0 t
187d0 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  est will always 
187e0 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72  fail on a NULL r
187f0 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a  ow of t2, which.
18800 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79    ** effectively
18810 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55   converts the OU
18820 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e  TER JOIN into an
18830 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a   INNER JOIN..  *
18840 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52  *.  ** THIS OVER
18850 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43  RIDES OBSOLETE C
18860 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20  OMMENTS 1 AND 2 
18870 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b  ABOVE:.  ** Tick
18880 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74  et #3300 shows t
18890 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  hat flattening t
188a0 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
188b0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a   a LEFT JOIN.  *
188c0 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74  * is fraught wit
188d0 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20  h danger.  Best 
188e0 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f  to avoid the who
188f0 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68  le thing.  If th
18900 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
18910 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72  is the right ter
18920 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
18930 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c  , then do not fl
18940 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  atten..  */.  if
18950 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69  ( (pSubitem->joi
18960 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
18970 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
18980 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
18990 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20  Restriction 17: 
189a0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
189b0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
189c0 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d  ELECT, then it m
189d0 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c  ust.  ** use onl
189e0 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  y the UNION ALL 
189f0 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f  operator. And no
18a00 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65  ne of the simple
18a10 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a   select queries.
18a20 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75    ** that make u
18a30 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53  p the compound S
18a40 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65  ELECT are allowe
18a50 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74  d to be aggregat
18a60 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20  e or distinct.  
18a70 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ** queries..  */
18a80 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72  .  if( pSub->pPr
18a90 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ior ){.    if( p
18aa0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
18ab0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
18ac0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
18ad0 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20   20 */.    }.   
18ae0 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70   if( isAgg || (p
18af0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
18b00 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20  Distinct)!=0 || 
18b10 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b  pSrc->nSrc!=1 ){
18b20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
18b30 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
18b40 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31  Sub1=pSub; pSub1
18b50 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70  ; pSub1=pSub1->p
18b60 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65  Prior){.      te
18b70 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
18b80 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
18b90 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
18ba0 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
18bb0 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  nct );.      tes
18bc0 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
18bd0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
18be0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
18bf0 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
18c00 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ate );.      ass
18c10 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21  ert( pSub->pSrc!
18c20 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
18c30 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
18c40 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
18c50 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d  SF_Aggregate))!=
18c60 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  0.       || (pSu
18c70 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
18c80 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
18c90 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62   .       || pSub
18ca0 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a  1->pSrc->nSrc<1.
18cb0 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e         || pSub->
18cc0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  pEList->nExpr!=p
18cd0 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Sub1->pEList->nE
18ce0 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  xpr.      ){.   
18cf0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
18d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
18d10 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53  tcase( pSub1->pS
18d20 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20  rc->nSrc>1 );.  
18d30 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74    }..    /* Rest
18d40 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20  riction 18. */. 
18d50 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
18d60 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
18d70 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  ii;.      for(ii
18d80 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72  =0; ii<p->pOrder
18d90 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  By->nExpr; ii++)
18da0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
18db0 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d  >pOrderBy->a[ii]
18dc0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20  .iOrderByCol==0 
18dd0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
18de0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
18df0 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65   /***** If we re
18e00 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
18e10 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
18e20 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a  rmitted. *****/.
18e30 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20  .  /* Authorize 
18e40 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
18e50 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
18e60 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65  ontext = pSubite
18e70 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54  m->zName;.  TEST
18e80 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65  ONLY(i =) sqlite
18e90 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
18ea0 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
18eb0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65  , 0, 0, 0);.  te
18ec0 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54  stcase( i==SQLIT
18ed0 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72  E_DENY );.  pPar
18ee0 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
18ef0 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
18f00 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  text;..  /* If t
18f10 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
18f20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
18f30 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
18f40 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f  n (by restrictio
18f50 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31  ns.  ** 17 and 1
18f60 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74  8 above) it must
18f70 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   be a UNION ALL 
18f80 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71  and the parent q
18f90 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20  uery must .  ** 
18fa0 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  be of the form:.
18fb0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
18fc0 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e  LECT <expr-list>
18fd0 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72   FROM (<sub-quer
18fe0 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73  y>) <where-claus
18ff0 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f  e> .  **.  ** fo
19000 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52  llowed by any OR
19010 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e  DER BY, LIMIT an
19020 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75  d/or OFFSET clau
19030 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a  ses. This block.
19040 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31    ** creates N-1
19050 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
19060 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68  arent query with
19070 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59  out any ORDER BY
19080 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a  , LIMIT or .  **
19090 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20   OFFSET clauses 
190a0 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74  and joins them t
190b0 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d  o the left-hand-
190c0 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67  side of the orig
190d0 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20  inal.  ** using 
190e0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
190f0 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ors. In this cas
19100 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
19110 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a  r of simple.  **
19120 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
19130 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75  ts in the compou
19140 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  nd sub-query..  
19150 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  **.  ** Example:
19160 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
19170 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28  ELECT a+1 FROM (
19180 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
19190 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20  ECT x FROM tab. 
191a0 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
191b0 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
191c0 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
191d0 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
191e0 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
191f0 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
19200 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20  z*2) FROM tab2. 
19210 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20   **     ) WHERE 
19220 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a  a!=5 ORDER BY 1.
19230 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66    **.  ** Transf
19240 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  ormed into:.  **
19250 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
19260 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   x+1 FROM tab WH
19270 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE x+1!=5.  ** 
19280 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
19290 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b  **     SELECT y+
192a0 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
192b0 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   y+1!=5.  **    
192c0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
192d0 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
192e0 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20  *2)+1 FROM tab2 
192f0 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31  WHERE abs(z*2)+1
19300 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44  !=5.  **     ORD
19310 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
19320 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74  * We call this t
19330 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  he "compound-sub
19340 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
19350 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53  "..  */.  for(pS
19360 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b  ub=pSub->pPrior;
19370 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62   pSub; pSub=pSub
19380 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53  ->pPrior){.    S
19390 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20  elect *pNew;.   
193a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
193b0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
193c0 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69  y;.    Expr *pLi
193d0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
193e0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72  .    Select *pPr
193f0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
19400 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
19410 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72   = 0;.    p->pSr
19420 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50  c = 0;.    p->pP
19430 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rior = 0;.    p-
19440 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
19450 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
19460 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
19470 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69  0);.    p->pLimi
19480 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
19490 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
194a0 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70  rderBy;.    p->p
194b0 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
194c0 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  p->op = TK_ALL;.
194d0 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
194e0 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  t = 0;.    if( p
194f0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
19500 70 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20  pNew = pPrior;. 
19510 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19520 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
19530 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65  Prior;.      pNe
19540 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
19550 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  0;.    }.    p->
19560 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
19570 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
19580 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
19590 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   1;.  }..  /* Be
195a0 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  gin flattening t
195b0 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  he iFrom-th entr
195c0 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
195d0 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68  ause .  ** in th
195e0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
195f0 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75   */.  pSub = pSu
19600 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  b1 = pSubitem->p
19610 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65  Select;..  /* De
19620 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65  lete the transie
19630 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
19640 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
19650 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
19660 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
19670 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
19680 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
19690 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
196a0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
196b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
196c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
196d0 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
196e0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  .  pSubitem->zDa
196f0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53  tabase = 0;.  pS
19700 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
19710 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
19720 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75  Alias = 0;.  pSu
19730 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  bitem->pSelect =
19740 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20   0;..  /* Defer 
19750 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62  deleting the Tab
19760 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  le object associ
19770 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
19780 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69  ** subquery unti
19790 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
197a0 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  n is.  ** comple
197b0 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  te, since there 
197c0 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20  may still exist 
197d0 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65  Expr.pTab entrie
197e0 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65  s that.  ** refe
197f0 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  r to the subquer
19800 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61  y even after fla
19810 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74  ttening.  Ticket
19820 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a   #3346..  **.  *
19830 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  * pSubitem->pTab
19840 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
19850 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74  ULL by test rest
19860 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73  rictions and tes
19870 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20  ts above..  */. 
19880 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62   if( ALWAYS(pSub
19890 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29  item->pTab!=0) )
198a0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
198b0 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65  bToDel = pSubite
198c0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
198d0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
198e0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72  ==1 ){.      Par
198f0 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
19900 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
19910 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
19920 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
19930 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f  NextZombie = pTo
19940 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
19950 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  ab;.      pTople
19960 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20  vel->pZombieTab 
19970 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20  = pTabToDel;.   
19980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
19990 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b  abToDel->nRef--;
199a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
199b0 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
199c0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
199d0 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
199e0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
199f0 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
19a00 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
19a10 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
19a20 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
19a30 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
19a40 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
19a50 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
19a60 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
19a70 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
19a80 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
19a90 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
19aa0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
19ab0 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
19ac0 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
19ad0 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
19ae0 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
19af0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
19b00 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
19b10 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
19b20 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
19b30 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
19b40 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
19b50 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
19b60 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
19b70 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
19b80 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
19b90 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
19ba0 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
19bb0 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
19bc0 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
19bd0 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
19be0 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
19bf0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
19c00 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
19c10 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
19c20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
19c30 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
19c40 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
19c50 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
19c60 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
19c70 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
19c80 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
19c90 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
19ca0 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
19cb0 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
19cc0 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
19cd0 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
19ce0 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
19cf0 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
19d00 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
19d10 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
19d20 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
19d30 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
19d40 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
19d50 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
19d60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
19d70 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
19d80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
19d90 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
19da0 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
19db0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
19dc0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
19dd0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
19de0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19df0 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
19e00 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
19e10 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
19e20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
19e30 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  e = pSubitem->jo
19e40 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  intype;.    }els
19e50 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
19e60 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20   pParent!=p );  
19e70 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  /* 2nd and subse
19e80 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f  quent times thro
19e90 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
19ea0 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61        pSrc = pPa
19eb0 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c  rent->pSrc = sql
19ec0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
19ed0 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d(db, 0, 0, 0);.
19ee0 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d        if( pSrc==
19ef0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
19f00 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
19f10 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
19f20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
19f30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
19f40 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
19f50 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66  a single slot of
19f60 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19f70 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20   of the outer.  
19f80 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20    ** query.  If 
19f90 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
19fa0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
19fb0 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52  lement in its FR
19fc0 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a  OM clause,.    *
19fd0 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68  * then expand th
19fe0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f  e outer query to
19ff0 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
1a000 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65  it to hold all e
1a010 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  lements.    ** o
1a020 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
1a030 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
1a040 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1a050 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a    **    SELECT *
1a060 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c   FROM tabA, (SEL
1a070 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c  ECT * FROM sub1,
1a080 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20   sub2), tabB;.  
1a090 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1a0a0 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20  outer query has 
1a0b0 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46  3 slots in its F
1a0c0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65  ROM clause.  One
1a0d0 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20   slot of the.   
1a0e0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
1a0f0 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74  (the middle slot
1a100 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  ) is used by the
1a110 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20   subquery.  The 
1a120 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63  next.    ** bloc
1a130 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65  k of code will e
1a140 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75  xpand the out qu
1a150 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20  ery to 4 slots. 
1a160 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20   The middle.    
1a170 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e  ** slot is expan
1a180 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73  ded to two slots
1a190 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
1a1a0 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a  e space for the.
1a1b0 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65      ** two eleme
1a1c0 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  nts in the FROM 
1a1d0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
1a1e0 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  bquery..    */. 
1a1f0 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
1a200 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
1a210 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d  t->pSrc = pSrc =
1a220 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1a230 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c  nlarge(db, pSrc,
1a240 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d   nSubSrc-1,iFrom
1a250 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  +1);.      if( d
1a260 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a270 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
1a280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a290 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
1a2a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1a2b0 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
1a2c0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1a2d0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1a2e0 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
1a2f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
1a300 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
1a310 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1a320 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
1a330 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
1a340 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  );.      pSrc->a
1a350 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
1a360 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
1a370 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
1a380 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
1a390 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
1a3a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
1a3b0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e  c->a[iFrom].join
1a3c0 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
1a3d0 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
1a3e0 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
1a3f0 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
1a400 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
1a410 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
1a420 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1a430 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
1a440 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
1a450 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
1a460 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
1a470 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
1a480 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
1a490 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
1a4a0 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
1a4b0 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
1a4c0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
1a4d0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
1a4e0 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
1a4f0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
1a500 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
1a510 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
1a520 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
1a530 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
1a540 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a550 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
1a560 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
1a570 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
1a580 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1a590 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
1a5a0 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
1a5b0 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
1a5c0 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
1a5d0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
1a5e0 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
1a5f0 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
1a600 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72      pList = pPar
1a610 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ent->pEList;.   
1a620 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1a630 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1a640 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
1a650 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29  >a[i].zName==0 )
1a660 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
1a670 63 68 61 72 20 2a 7a 53 70 61 6e 20 3d 20 70 4c  char *zSpan = pL
1a680 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b  ist->a[i].zSpan;
1a690 0a 20 20 20 20 20 20 20 20 69 66 28 20 41 4c 57  .        if( ALW
1a6a0 41 59 53 28 7a 53 70 61 6e 29 20 29 7b 0a 20 20  AYS(zSpan) ){.  
1a6b0 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61          pList->a
1a6c0 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
1a6d0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
1a6e0 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
1a6f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1a700 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1a710 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
1a720 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
1a730 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1a740 20 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a     if( isAgg ){.
1a750 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1a760 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
1a770 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65  >pGroupBy, iPare
1a780 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1a790 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1a7a0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73  ->pHaving = subs
1a7b0 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
1a7c0 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  t->pHaving, iPar
1a7d0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1a7e0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
1a7f0 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
1a800 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1a810 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  ( pParent->pOrde
1a820 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
1a830 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1a840 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
1a850 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
1a860 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1a870 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
1a880 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ent->pOrderBy ){
1a890 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1a8a0 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1a8b0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
1a8c0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1a8d0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
1a8e0 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29  ( pSub->pWhere )
1a8f0 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d  {.      pWhere =
1a900 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1a910 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65  db, pSub->pWhere
1a920 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1a930 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
1a940 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1a950 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
1a960 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1a970 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1a980 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
1a990 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
1a9a0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b  pParent->pWhere;
1a9b0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1a9c0 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
1a9d0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1a9e0 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
1a9f0 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
1aa00 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
1aa10 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1aa20 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1aa30 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
1aa40 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
1aa50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
1aa60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
1aa90 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76  p(db, pSub->pHav
1aaa0 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ing, 0));.      
1aab0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1aac0 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
1aad0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1aae0 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
1aaf0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
1ab00 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c   pSub->pGroupBy,
1ab10 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1ab20 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1ab30 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70  Where = substExp
1ab40 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
1ab50 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20  Where, iParent, 
1ab60 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1ab70 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1ab80 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
1ab90 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e  prAnd(db, pParen
1aba0 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72  t->pWhere, pWher
1abb0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
1abc0 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
1abd0 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
1abe0 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
1abf0 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
1ac00 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
1ac10 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a  y is distinct. .
1ac20 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65      */.    pPare
1ac30 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  nt->selFlags |= 
1ac40 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1ac50 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20   SF_Distinct;.  
1ac60 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
1ac70 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28  ELECT ... FROM (
1ac80 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54  SELECT ... LIMIT
1ac90 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d   a OFFSET b) LIM
1aca0 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20  IT x OFFSET y;. 
1acb0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65     **.    ** One
1acc0 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
1acd0 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
1ace0 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
1acf0 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
1ad00 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e  is.    ** does n
1ad10 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65  ot work if eithe
1ad20 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  r limit is negat
1ad30 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
1ad40 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1ad50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
1ad60 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62  t->pLimit = pSub
1ad70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
1ad80 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
1ad90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1ada0 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65  * Finially, dele
1adb0 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20  te what is left 
1adc0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1add0 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
1ade0 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  success..  */.  
1adf0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1ae00 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a  ete(db, pSub1);.
1ae10 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
1ae20 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1ae30 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1ae40 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1ae50 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1ae60 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  VIEW) */../*.** 
1ae70 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45  Analyze the SELE
1ae80 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  CT statement pas
1ae90 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
1aea0 6e 74 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a  nt to see if it.
1aeb0 2a 2a 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72  ** is a min() or
1aec0 20 6d 61 78 28 29 20 71 75 65 72 79 2e 20 52 65   max() query. Re
1aed0 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
1aee0 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
1aef0 4f 52 44 45 52 42 59 5f 4d 41 58 20 69 66 20 0a  ORDERBY_MAX if .
1af00 2a 2a 20 69 74 20 69 73 2c 20 6f 72 20 30 20 6f  ** it is, or 0 o
1af10 74 68 65 72 77 69 73 65 2e 20 41 74 20 70 72 65  therwise. At pre
1af20 73 65 6e 74 2c 20 61 20 71 75 65 72 79 20 69 73  sent, a query is
1af30 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
1af40 65 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78  e.** a min()/max
1af50 28 29 20 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a  () query if:.**.
1af60 2a 2a 20 20 20 31 2e 20 54 68 65 72 65 20 69 73  **   1. There is
1af70 20 61 20 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74   a single object
1af80 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1af90 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20  use..**.**   2. 
1afa0 54 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c  There is a singl
1afb0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  e expression in 
1afc0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
1afd0 61 6e 64 20 69 74 20 69 73 0a 2a 2a 20 20 20 20  and it is.**    
1afe0 20 20 65 69 74 68 65 72 20 6d 69 6e 28 78 29 20    either min(x) 
1aff0 6f 72 20 6d 61 78 28 78 29 2c 20 77 68 65 72 65  or max(x), where
1b000 20 78 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72   x is a column r
1b010 65 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  eference..*/.sta
1b020 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65  tic u8 minMaxQue
1b030 72 79 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ry(Select *p){. 
1b040 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
1b050 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1b060 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   = p->pEList;.. 
1b070 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
1b080 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 57  pr!=1 ) return W
1b090 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
1b0a0 4d 41 4c 3b 0a 20 20 70 45 78 70 72 20 3d 20 70  MAL;.  pExpr = p
1b0b0 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1b0c0 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
1b0d0 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
1b0e0 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
1b0f0 20 20 69 66 28 20 4e 45 56 45 52 28 45 78 70 72    if( NEVER(Expr
1b100 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1b110 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1b120 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1b130 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
1b140 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  x.pList;.  if( p
1b150 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69  EList==0 || pELi
1b160 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
1b170 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
1b180 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1b190 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  r->op!=TK_AGG_CO
1b1a0 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 48  LUMN ) return WH
1b1b0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
1b1c0 41 4c 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  AL;.  assert( !E
1b1d0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1b1e0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1b1f0 65 29 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  e) );.  if( sqli
1b200 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72  te3StrICmp(pExpr
1b210 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 69 6e 22  ->u.zToken,"min"
1b220 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
1b230 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
1b240 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _MIN;.  }else if
1b250 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1b260 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
1b270 2c 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20  ,"max")==0 ){.  
1b280 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f    return WHERE_O
1b290 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a  RDERBY_MAX;.  }.
1b2a0 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f    return WHERE_O
1b2b0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d  RDERBY_NORMAL;.}
1b2c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
1b2d0 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
1b2e0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1b2f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
1b300 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
1b310 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
1b320 72 67 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73  rgment is the as
1b330 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61  sociated aggrega
1b340 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  te-info object. 
1b350 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
1b360 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53  n tests if the S
1b370 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
1b380 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  form:.**.**   SE
1b390 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1b3a0 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77  OM <tbl>.**.** w
1b3b0 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20  here table is a 
1b3c0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
1b3d0 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74  not a sub-select
1b3e0 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65   or view. If the
1b3f0 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d   query.** does m
1b400 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72  atch this patter
1b410 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  n, then a pointe
1b420 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f  r to the Table o
1b430 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
1b440 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72  ng.** <tbl> is r
1b450 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1b460 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
1b470 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62  d..*/.static Tab
1b480 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e  le *isSimpleCoun
1b490 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67  t(Select *p, Agg
1b4a0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
1b4b0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
1b4c0 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a    Expr *pExpr;..
1b4d0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47    assert( !p->pG
1b4e0 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28  roupBy );..  if(
1b4f0 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d   p->pWhere || p-
1b500 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
1b510 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63  1 .   || p->pSrc
1b520 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e  ->nSrc!=1 || p->
1b530 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
1b540 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ct.  ){.    retu
1b550 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
1b560 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
1b570 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d  .pTab;.  pExpr =
1b580 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
1b590 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  .pExpr;.  assert
1b5a0 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d  ( pTab && !pTab-
1b5b0 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70  >pSelect && pExp
1b5c0 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69  r );..  if( IsVi
1b5d0 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
1b5e0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1b5f0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
1b600 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
1b610 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  n 0;.  if( NEVER
1b620 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  (pAggInfo->nFunc
1b630 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
1b640 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f  .  if( (pAggInfo
1b650 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63  ->aFunc[0].pFunc
1b660 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ->flags&SQLITE_F
1b670 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
1b680 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1b690 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
1b6a0 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
1b6b0 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
1b6c0 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
1b6d0 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
1b6e0 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
1b6f0 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
1b700 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
1b710 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
1b720 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
1b730 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
1b740 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
1b750 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
1b760 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
1b770 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
1b780 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
1b790 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
1b7a0 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
1b7b0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
1b7c0 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
1b7d0 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
1b7e0 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
1b7f0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1b800 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
1b810 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
1b820 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
1b830 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
1b840 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
1b850 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
1b860 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65   && pFrom->zInde
1b870 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  x ){.    Table *
1b880 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
1b890 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  ab;.    char *zI
1b8a0 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49  ndex = pFrom->zI
1b8b0 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20  ndex;.    Index 
1b8c0 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
1b8d0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
1b8e0 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  ; .        pIdx 
1b8f0 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
1b900 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pIdx->zName, z
1b910 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20  Index); .       
1b920 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
1b930 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
1b940 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !pIdx ){.      
1b950 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1b960 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
1b970 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e   index: %s", zIn
1b980 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  dex, 0);.      p
1b990 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
1b9a0 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ma = 1;.      re
1b9b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1b9c0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72  R;.    }.    pFr
1b9d0 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64  om->pIndex = pId
1b9e0 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
1b9f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1ba00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ba10 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c   is a Walker cal
1ba20 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e  lback for "expan
1ba30 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73  ding" a SELECT s
1ba40 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78  tatement..** "Ex
1ba50 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74  panding" means t
1ba60 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  o do the followi
1ba70 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ng:.**.**    (1)
1ba80 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45    Make sure VDBE
1ba90 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1baa0 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
1bab0 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20  ed to every.**  
1bac0 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f         element o
1bad0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1bae0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
1baf0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
1bb00 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
1bb10 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
1bb20 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
1bb30 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46         defines F
1bb40 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65  ROM clause.  Whe
1bb50 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69  n views appear i
1bb60 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1bb70 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69  e,.**         fi
1bb80 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  ll pTabList->a[]
1bb90 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20  .pSelect with a 
1bba0 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
1bbb0 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
1bbc0 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70          that imp
1bbd0 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
1bbe0 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  .  A copy is mad
1bbf0 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20  e of the view's 
1bc00 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
1bc10 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74    statement so t
1bc20 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c  hat we can freel
1bc30 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65  y modify or dele
1bc40 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
1bc50 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74  t.**         wit
1bc60 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62  hout worrying ab
1bc70 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74  out messing up t
1bc80 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65  he presistent re
1bc90 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  presentation.** 
1bca0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76          of the v
1bcb0 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33  iew..**.**    (3
1bcc0 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20  )  Add terms to 
1bcd0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1bce0 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74   to accomodate t
1bcf0 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
1bd00 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
1bd10 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
1bd20 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
1bd30 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
1bd40 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
1bd50 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
1bd60 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
1bd70 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
1bd80 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
1bd90 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
1bda0 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
1bdb0 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
1bdc0 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
1bdd0 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
1bde0 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
1bdf0 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
1be00 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
1be10 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
1be20 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
1be30 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
1be40 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74   TABLE..**.*/.st
1be50 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45  atic int selectE
1be60 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a  xpander(Walker *
1be70 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
1be80 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
1be90 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
1bea0 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c  pParse;.  int i,
1beb0 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74   j, k;.  SrcList
1bec0 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
1bed0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
1bee0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1bef0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
1bf00 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1bf10 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
1bf20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1bf30 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d  ){.    return
1bf40 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
1bf50 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70    if( NEVER(p->p
1bf60 53 72 63 3d 3d 30 29 20 7c 7c 20 28 70 2d 3e 73  Src==0) || (p->s
1bf70 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70  elFlags & SF_Exp
1bf80 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20  anded)!=0 ){.   
1bf90 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
1bfa0 65 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 65 6c 46  e;.  }.  p->selF
1bfb0 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e  lags |= SF_Expan
1bfc0 64 65 64 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  ded;.  pTabList 
1bfd0 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
1bfe0 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
1bff0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1c000 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
1c010 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
1c020 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65  ed to all entrie
1c030 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52  s in.  ** the FR
1c040 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1c050 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1c060 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
1c070 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1c080 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54  rsors(pParse, pT
1c090 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c  abList);..  /* L
1c0a0 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62  ook up every tab
1c0b0 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  le named in the 
1c0c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1c0d0 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20  he select.  If. 
1c0e0 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   ** an entry of 
1c0f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1c100 69 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e  is a subquery in
1c110 73 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65  stead of a table
1c120 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74   or view,.  ** t
1c130 68 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61  hen create a tra
1c140 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
1c150 75 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69  ucture to descri
1c160 62 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  be the subquery.
1c170 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
1c180 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
1c190 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
1c1a0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
1c1b0 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
1c1c0 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46  pTab;.    if( pF
1c1d0 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a  rom->pTab!=0 ){.
1c1e0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74        /* This st
1c1f0 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65  atement has alre
1c200 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65  ady been prepare
1c210 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  d.  There is no 
1c220 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  need.      ** to
1c230 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a   go further. */.
1c240 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
1c250 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  =0 );.      retu
1c260 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1c270 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f    }.    if( pFro
1c280 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23  m->zName==0 ){.#
1c290 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c2a0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1c2b0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
1c2c0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
1c2d0 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
1c2e0 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
1c2f0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
1c300 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
1c310 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b  sert( pSel!=0 );
1c320 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c330 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
1c340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
1c350 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
1c360 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70  , pSel);.      p
1c370 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
1c380 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
1c390 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
1c3a0 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  of(Table));.    
1c3b0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
1c3c0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1c3d0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
1c3e0 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54  ef = 1;.      pT
1c3f0 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
1c400 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1c410 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f  sqlite_subquery_
1c420 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 54 61  %p_", (void*)pTa
1c430 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  b);.      while(
1c440 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b   pSel->pPrior ){
1c450 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
1c460 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65  rior; }.      se
1c470 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
1c480 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1c490 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70  pSel->pEList, &p
1c4a0 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
1c4b0 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70  ->aCol);.      p
1c4c0 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
1c4d0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  .      pTab->nRo
1c4e0 77 45 73 74 20 3d 20 31 30 30 30 30 30 30 3b 0a  wEst = 1000000;.
1c4f0 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
1c500 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
1c510 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  eral;.#endif.   
1c520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
1c530 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
1c540 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
1c550 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1c560 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  se */.      asse
1c570 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
1c580 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
1c590 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
1c5a0 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
1c5b0 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
1c5c0 72 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61  rse,0,pFrom->zNa
1c5d0 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62  me,pFrom->zDatab
1c5e0 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ase);.      if( 
1c5f0 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
1c600 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
1c610 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
1c620 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1c630 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
1c640 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49  | !defined (SQLI
1c650 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1c660 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20  ABLE).      if( 
1c670 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c  pTab->pSelect ||
1c680 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
1c690 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
1c6a0 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20  e reach here if 
1c6b0 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
1c6c0 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69  is a really a vi
1c6d0 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ew */.        if
1c6e0 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
1c6f0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
1c700 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75  se, pTab) ) retu
1c710 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1c720 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
1c730 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
1c740 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
1c750 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
1c760 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
1c770 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20   pTab->pSelect, 
1c780 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1c790 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
1c7a0 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
1c7b0 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a  elect);.      }.
1c7c0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
1c7d0 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
1c7e0 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74  index named by t
1c7f0 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  he INDEXED BY cl
1c800 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ause, if any. */
1c810 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1c820 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
1c830 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
1c840 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
1c850 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
1c860 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
1c870 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  s NATURAL keywor
1c880 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55  ds, and ON and U
1c890 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
1c8a0 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  joins..  */.  if
1c8b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1c8c0 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63  ed || sqliteProc
1c8d0 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20  essJoin(pParse, 
1c8e0 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
1c8f0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
1c900 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
1c910 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
1c920 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
1c930 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
1c940 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
1c950 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
1c960 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
1c970 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
1c980 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
1c990 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
1c9a0 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
1c9b0 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
1c9c0 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
1c9d0 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
1c9e0 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65  h the TK_ALL ope
1c9f0 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22  rator for each "
1ca00 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64  *" that it found
1ca10 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
1ca20 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  ist..  ** The fo
1ca30 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
1ca40 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
1ca50 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65  the TK_ALL expre
1ca60 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
1ca70 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20  d.  ** each one 
1ca80 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
1ca90 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
1caa0 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
1cab0 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
1cac0 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
1cad0 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
1cae0 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
1caf0 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
1cb00 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
1cb10 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
1cb20 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
1cb30 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  k++){.    Expr *
1cb40 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
1cb50 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
1cb60 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
1cb70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
1cb80 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
1cb90 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
1cba0 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
1cbb0 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
1cbc0 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74  OT || (pE->pLeft
1cbd0 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  !=0 && pE->pLeft
1cbe0 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a  ->op==TK_ID) );.
1cbf0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
1cc00 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52  TK_DOT && pE->pR
1cc10 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ight->op==TK_ALL
1cc20 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1cc30 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
1cc40 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
1cc50 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
1cc60 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
1cc70 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
1cc80 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
1cc90 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
1cca0 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
1ccb0 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
1ccc0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
1ccd0 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
1cce0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
1ccf0 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
1cd00 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
1cd10 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
1cd20 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1cd30 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
1cd40 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
1cd50 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
1cd60 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
1cd70 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
1cd80 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
1cd90 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1cda0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
1cdb0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
1cdc0 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61           && (fla
1cdd0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
1cde0 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
1cdf0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
1ce00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
1ce10 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
1ce20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
1ce30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ce40 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
1ce50 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29   pE->pRight!=0 )
1ce60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
1ce70 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28 70  op!=TK_ALL && (p
1ce80 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
1ce90 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21   pE->pRight->op!
1cea0 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
1ceb0 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
1cec0 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
1ced0 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
1cee0 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
1cef0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1cf00 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1cf10 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1cf20 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
1cf30 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  k].pExpr);.     
1cf40 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
1cf50 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
1cf60 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
1cf70 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
1cf80 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  me;.          pN
1cf90 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
1cfa0 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b  r-1].zSpan = a[k
1cfb0 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20  ].zSpan;.       
1cfc0 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20     a[k].zName = 
1cfd0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  0;.          a[k
1cfe0 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20  ].zSpan = 0;.   
1cff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1d000 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20  [k].pExpr = 0;. 
1d010 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d020 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72      /* This expr
1d030 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20  ession is a "*" 
1d040 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61  or a "TABLE.*" a
1d050 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  nd needs to be. 
1d060 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64         ** expand
1d070 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ed. */.        i
1d080 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30  nt tableSeen = 0
1d090 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f  ;      /* Set to
1d0a0 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61   1 when TABLE ma
1d0b0 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  tches */.       
1d0c0 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20   char *zTName;  
1d0d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78            /* tex
1d0e0 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42  t of name of TAB
1d0f0 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  LE */.        if
1d100 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
1d110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
1d120 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21  sert( pE->pLeft!
1d130 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1d140 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1d150 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65  Property(pE->pLe
1d160 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  ft, EP_IntValue)
1d170 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   );.          zT
1d180 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74  Name = pE->pLeft
1d190 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
1d1a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d1b0 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b       zTName = 0;
1d1c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d1d0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
1d1e0 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
1d1f0 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
1d200 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
1d210 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20            Table 
1d220 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
1d230 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63  Tab;.          c
1d240 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
1d250 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
1d260 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
1d270 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
1d280 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
1d290 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
1d2a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d2b0 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
1d2c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
1d2d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ak;.          if
1d2e0 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69  ( zTName && sqli
1d2f0 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d  te3StrICmp(zTNam
1d300 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20  e, zTabName)!=0 
1d310 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
1d320 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1d330 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
1d340 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ableSeen = 1;.  
1d350 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1d360 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
1d370 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1d380 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a 70   Expr *pExpr, *p
1d390 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
1d3a0 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
1d3b0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
1d3c0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
1d3d0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65    char *zColname
1d3e0 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74  ;  /* The comput
1d3f0 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  ed column name *
1d400 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  /.            ch
1d410 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f  ar *zToFree;   /
1d420 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e  * Malloced strin
1d430 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  g that needs to 
1d440 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
1d450 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43          Token sC
1d460 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70  olname;  /* Comp
1d470 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
1d480 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a   as a token */..
1d490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1d4a0 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61  f a column is ma
1d4b0 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27  rked as 'hidden'
1d4c0 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79   (currently only
1d4d0 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
1d4e0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72        ** for vir
1d4f0 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f  tual tables), do
1d500 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20   not include it 
1d510 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a  in the expanded.
1d520 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
1d530 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a  esult-set list..
1d540 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
1d550 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49             if( I
1d560 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70  sHiddenColumn(&p
1d570 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b  Tab->aCol[j]) ){
1d580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
1d590 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c 28  ssert(IsVirtual(
1d5a0 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20  pTab));.        
1d5b0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
1d5d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
1d5e0 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20  >0 && zTName==0 
1d5f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1d600 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69   if( (pFrom->joi
1d610 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
1d620 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  AL)!=0.         
1d630 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41         && tableA
1d640 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54  ndColumnIndex(pT
1d650 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65  abList, i, zName
1d660 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20  , 0, 0).        
1d670 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1d680 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
1d690 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
1d6a0 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
1d6b0 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1d6d0 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72  * table to the r
1d6e0 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  ight of the join
1d6f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1d700 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1d710 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1d720 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d730 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64  sqlite3IdListInd
1d740 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67  ex(pFrom->pUsing
1d750 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d770 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
1d780 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
1d790 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
1d7a0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
1d7b0 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
1d7c0 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
1d7d0 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
1d7e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1d7f0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1d800 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1d810 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1d820 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
1d830 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
1d840 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b  , TK_ID, zName);
1d850 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f  .            zCo
1d860 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  lname = zName;. 
1d870 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
1d880 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ee = 0;.        
1d890 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
1d8a0 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e  s || pTabList->n
1d8b0 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  Src>1 ){.       
1d8c0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65         Expr *pLe
1d8d0 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ft;.            
1d8e0 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
1d8f0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
1d900 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20   zTabName);.    
1d910 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
1d920 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1d930 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
1d940 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
1d950 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d960 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b  if( longNames ){
1d970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d980 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69   zColname = sqli
1d990 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1d9a0 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65  %s.%s", zTabName
1d9b0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
1d9c0 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
1d9d0 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  e = zColname;.  
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1d9f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1da00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1da10 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
1da20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1da30 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
1da40 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1da50 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
1da60 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
1da70 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65          sColname
1da80 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  .z = zColname;. 
1da90 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e             sColn
1daa0 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53  ame.n = sqlite3S
1dab0 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65  trlen30(zColname
1dac0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1dad0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
1dae0 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
1daf0 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30  ew, &sColname, 0
1db00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1db10 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1db20 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20   zToFree);.     
1db30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1db40 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61  .        if( !ta
1db50 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20  bleSeen ){.     
1db60 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
1db70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1db80 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1db90 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1dba0 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61  table: %s", zTNa
1dbb0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
1dbc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1dbd0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1dbe0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
1dbf0 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
1dc00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1dc10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1dc20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1dc30 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1dc40 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  db, pEList);.   
1dc50 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
1dc60 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  w;.  }.#if SQLIT
1dc70 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69  E_MAX_COLUMN.  i
1dc80 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  f( p->pEList && 
1dc90 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
1dca0 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
1dcb0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
1dcc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1dcd0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1dce0 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
1dcf0 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
1dd00 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1dd10 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1dd20 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
1dd30 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
1dd40 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
1dd50 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  alker..**.** Whe
1dd60 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1dd70 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78  s the Walker.xEx
1dd80 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
1dd90 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
1dda0 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77  .** are walked w
1ddb0 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f  ithout any actio
1ddc0 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61  ns being taken a
1ddd0 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72  t each node.  Pr
1dde0 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65  esumably,.** whe
1ddf0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1de00 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65  s used for Walke
1de10 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
1de20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e  then .** Walker.
1de30 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1de40 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d  is set to do som
1de50 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f  ething useful fo
1de60 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71  r every .** subq
1de70 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
1de80 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  er tree..*/.stat
1de90 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e  ic int exprWalkN
1dea0 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
1deb0 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73  sed, Expr *NotUs
1dec0 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
1ded0 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
1dee0 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
1def0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1df00 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nue;.}../*.** Th
1df10 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61  is routine "expa
1df20 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74  nds" a SELECT st
1df30 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20  atement and all 
1df40 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65  of its subquerie
1df50 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69  s..** For additi
1df60 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1df70 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e   on what it mean
1df80 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20  s to "expand" a 
1df90 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
1dfa0 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d  ent, see the com
1dfb0 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65  ment on the sele
1dfc0 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20  ctExpand worker 
1dfd0 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a  callback above..
1dfe0 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20  **.** Expanding 
1dff0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1e000 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
1e010 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69  step in processi
1e020 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  ng a.** SELECT s
1e030 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53  tatement.  The S
1e040 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1e050 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
1e060 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20   before.** name 
1e070 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65  resolution is pe
1e080 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  rformed..**.** I
1e090 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
1e0a0 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20  wrong, an error 
1e0b0 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
1e0c0 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a  en into pParse..
1e0d0 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
1e0e0 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65  unction can dete
1e0f0 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62  ct the problem b
1e100 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61  y looking at pPa
1e110 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64  rse->nErr.** and
1e120 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  /or pParse->db->
1e130 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f  mallocFailed..*/
1e140 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
1e150 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
1e160 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1e170 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
1e180 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
1e190 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
1e1a0 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64  k = selectExpand
1e1b0 65 72 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  er;.  w.xExprCal
1e1c0 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b  lback = exprWalk
1e1d0 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
1e1e0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c   = pParse;.  sql
1e1f0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
1e200 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a  w, pSelect);.}..
1e210 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e220 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
1e230 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61  .** This is a Wa
1e240 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
1e250 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f  back callback fo
1e260 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c  r the sqlite3Sel
1e270 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a  ectTypeInfo().**
1e280 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
1e290 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d  * For each FROM-
1e2a0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c  clause subquery,
1e2b0 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70   add Column.zTyp
1e2c0 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  e and Column.zCo
1e2d0 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
1e2e0 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  n to the Table s
1e2f0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
1e300 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
1e310 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68  ult set.** of th
1e320 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  at subquery..**.
1e330 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
1e340 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
1e350 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
1e360 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72  t set was constr
1e370 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65  ucted.** by sele
1e380 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74  ctExpander() but
1e390 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f   the type and co
1e3a0 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
1e3b0 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a  ion was omitted.
1e3c0 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ** at that point
1e3d0 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66   because identif
1e3e0 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74  iers had not yet
1e3f0 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
1e400 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
1e410 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
1e420 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f   identifier reso
1e430 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
1e440 63 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64 53  c int selectAddS
1e450 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28  ubqueryTypeInfo(
1e460 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
1e470 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
1e480 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
1e490 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
1e4a0 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74   *pTabList;.  st
1e4b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1e4c0 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73  m *pFrom;..  ass
1e4d0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
1e4e0 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29   & SF_Resolved )
1e4f0 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
1e500 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70  lags & SF_HasTyp
1e510 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20  eInfo)==0 ){.   
1e520 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
1e530 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a  SF_HasTypeInfo;.
1e540 20 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61      pParse = pWa
1e550 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
1e560 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
1e570 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSrc;.    for(i=
1e580 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
1e590 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
1e5a0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
1e5b0 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62  om++){.      Tab
1e5c0 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
1e5d0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ->pTab;.      if
1e5e0 28 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d 30  ( ALWAYS(pTab!=0
1e5f0 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  ) && (pTab->tabF
1e600 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
1e610 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
1e620 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
1e630 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
1e640 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
1e650 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
1e660 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
1e670 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
1e680 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 20     assert( pSel 
1e690 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
1e6a0 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
1e6b0 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
1e6c0 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 65  rior;.        se
1e6d0 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
1e6e0 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
1e6f0 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  arse, pTab->nCol
1e700 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53  , pTab->aCol, pS
1e710 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
1e720 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1e730 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
1e740 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
1e750 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
1e760 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f   datatype and co
1e770 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1e780 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a   information to.
1e790 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  ** the Table str
1e7a0 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46  uctures of all F
1e7b0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1e7c0 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45  eries in a.** SE
1e7d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
1e7e0 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72  **.** Use this r
1e7f0 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d  outine after nam
1e800 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  e resolution..*/
1e810 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
1e820 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
1e830 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  eInfo(Parse *pPa
1e840 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
1e850 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  lect){.#ifndef S
1e860 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1e870 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  ERY.  Walker w;.
1e880 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
1e890 61 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64 53  ack = selectAddS
1e8a0 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b  ubqueryTypeInfo;
1e8b0 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
1e8c0 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f  ck = exprWalkNoo
1e8d0 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
1e8e0 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
1e8f0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
1e900 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66  pSelect);.#endif
1e910 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1e920 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20  routine sets up 
1e930 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1e940 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  nt for processin
1e950 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  g.  The.** follo
1e960 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69  wing is accompli
1e970 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  shed:.**.**     
1e980 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e  *  VDBE Cursor n
1e990 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67  umbers are assig
1e9a0 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d  ned to all FROM-
1e9b0 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
1e9c0 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61       *  Ephemera
1e9d0 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  l Table objects 
1e9e0 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
1e9f0 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
1ea00 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20  subqueries..**  
1ea10 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49     *  ON and USI
1ea20 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73  NG clauses are s
1ea30 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52  hifted into WHER
1ea40 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  E statements.** 
1ea50 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73      *  Wildcards
1ea60 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e   "*" and "TABLE.
1ea70 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  *" in result set
1ea80 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a  s are expanded..
1ea90 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69  **     *  Identi
1eaa0 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73  fiers in express
1eab0 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20  ion are matched 
1eac0 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  to tables..**.**
1ead0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
1eae0 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ts recursively o
1eaf0 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73  n all subqueries
1eb00 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45   within the SELE
1eb10 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
1eb20 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20  te3SelectPrep(. 
1eb30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1eb40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1eb50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
1eb60 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1eb70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1eb80 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1eb90 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
1eba0 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
1ebb0 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
1ebc0 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63  me context for c
1ebd0 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20  ontainer */.){. 
1ebe0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1ebf0 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
1ec00 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
1ec10 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1ec20 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
1ec30 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20   SF_HasTypeInfo 
1ec40 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1ec50 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
1ec60 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
1ec70 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1ec80 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1ec90 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
1eca0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
1ecb0 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
1ecc0 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
1ecd0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1ece0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1ecf0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
1ed00 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
1ed10 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73  ddTypeInfo(pPars
1ed20 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, p);.}../*.** 
1ed30 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
1ed40 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
1ed50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
1ed60 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
1ed70 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
1ed80 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
1ed90 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
1eda0 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
1edb0 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
1edc0 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
1edd0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  s.** routine gen
1ede0 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
1edf0 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e   stores NULLs in
1ee00 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65   all of those me
1ee10 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a  mory.** cells..*
1ee20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
1ee30 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
1ee40 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
1ee50 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
1ee60 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1ee70 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1ee80 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
1ee90 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
1eea0 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e  nc;.  if( pAggIn
1eeb0 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e  fo->nFunc+pAggIn
1eec0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29  fo->nColumn==0 )
1eed0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1eee0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
1eef0 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
1ef00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1ef10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ef20 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
1ef30 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
1ef40 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Mem);.  }.  for(
1ef50 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
1ef60 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
1ef70 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1ef80 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
1ef90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1efa0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1efb0 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b  0, pFunc->iMem);
1efc0 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
1efd0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
1efe0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
1eff0 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
1f000 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1f010 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1f020 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1f030 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
1f040 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
1f050 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
1f060 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
1f070 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1f080 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
1f090 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
1f0a0 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
1f0b0 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
1f0c0 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
1f0d0 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
1f0e0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
1f0f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f100 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1f110 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
1f120 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1f130 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20   pE->x.pList);. 
1f140 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1f150 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
1f160 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46  penEphemeral, pF
1f170 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20  unc->iDistinct, 
1f180 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1a0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
1f1b0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
1f1c0 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OFF);.      }.  
1f1d0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1f1e0 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
1f1f0 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
1f200 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
1f210 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
1f220 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
1f230 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
1f240 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
1f250 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
1f260 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
1f270 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1f280 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1f290 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1f2a0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1f2b0 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
1f2c0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
1f2d0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
1f2e0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1f2f0 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
1f300 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
1f310 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
1f320 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
1f330 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1f340 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
1f350 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1f360 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1f370 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
1f380 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
1f390 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
1f3a0 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a  ->nExpr : 0, 0,.
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3c0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
1f3d0 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
1f3e0 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
1f3f0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
1f400 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
1f410 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
1f420 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
1f430 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
1f440 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
1f450 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1f460 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
1f470 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1f480 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1f490 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
1f4a0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1f4b0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65   int i;.  int re
1f4c0 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  gHit = 0;.  int 
1f4d0 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b  addrHitTest = 0;
1f4e0 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
1f4f0 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74  o_func *pF;.  st
1f500 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
1f510 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66   *pC;..  pAggInf
1f520 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
1f530 31 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  1;.  sqlite3Expr
1f540 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
1f550 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
1f560 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
1f570 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
1f580 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
1f590 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
1f5a0 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
1f5b0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
1f5c0 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  gAgg;.    ExprLi
1f5d0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
1f5e0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
1f5f0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1f600 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
1f610 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
1f620 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
1f630 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
1f640 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nArg = pList->nE
1f650 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67  xpr;.      regAg
1f660 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1f670 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
1f680 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  nArg);.      sql
1f690 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
1f6a0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
1f6b0 73 74 2c 20 72 65 67 41 67 67 2c 20 31 29 3b 0a  st, regAgg, 1);.
1f6c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f6d0 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20   nArg = 0;.     
1f6e0 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20   regAgg = 0;.   
1f6f0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69   }.    if( pF->i
1f700 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
1f710 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20       addrNext = 
1f720 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1f730 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61  abel(v);.      a
1f740 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29  ssert( nArg==1 )
1f750 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  ;.      codeDist
1f760 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
1f770 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
1f780 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
1f790 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f7a0 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73  pF->pFunc->flags
1f7b0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
1f7c0 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
1f7d0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
1f7e0 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63  = 0;.      struc
1f7f0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1f800 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e  *pItem;.      in
1f810 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
1f820 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20  t( pList!=0 );  
1f830 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70  /* pList!=0 if p
1f840 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45  F->pFunc has NEE
1f850 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66  DCOLL */.      f
1f860 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
1f870 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
1f880 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70  & j<nArg; j++, p
1f890 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
1f8a0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1f8b0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
1f8c0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
1f8d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f8e0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
1f8f0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
1f900 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
1f910 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
1f920 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d      if( regHit==
1f930 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  0 && pAggInfo->n
1f940 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65  Accumulator ) re
1f950 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gHit = ++pParse-
1f960 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
1f970 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1f980 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65  , OP_CollSeq, re
1f990 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61  gHit, 0, 0, (cha
1f9a0 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
1f9b0 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
1f9c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f9d0 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op4(v, OP_AggSte
1f9e0 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  p, 0, regAgg, pF
1f9f0 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->iMem,.        
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1fa10 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
1fa20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
1fa30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1fa40 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
1fa50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1fa60 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1fa70 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
1fa80 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
1fa90 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1faa0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1fab0 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
1fac0 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
1fad0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1fae0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1faf0 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
1fb00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1fb10 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
1fb20 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
1fb30 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75    /* Before popu
1fb40 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  lating the accum
1fb50 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
1fb60 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  , clear the colu
1fb70 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f  mn cache..  ** O
1fb80 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79  therwise, if any
1fb90 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64   of the required
1fba0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
1fbb0 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  re already prese
1fbc0 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69  nt .  ** in regi
1fbd0 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78  sters, sqlite3Ex
1fbe0 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65  prCode() may use
1fbf0 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70   OP_SCopy to cop
1fc00 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a  y the value.  **
1fc10 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75   to pC->iMem. Bu
1fc20 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  t by the time th
1fc30 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c  e value is used,
1fc40 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65   the original re
1fc50 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20  gister.  ** may 
1fc60 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20  have been used, 
1fc70 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
1fc80 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66   underlying buff
1fc90 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  er holding the. 
1fca0 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   ** text or blob
1fcb0 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b   value. See tick
1fcc0 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e  et [883034dcb5].
1fcd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68  .  **.  ** Anoth
1fce0 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c  er solution woul
1fcf0 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74  d be to change t
1fd00 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64  he OP_SCopy used
1fd10 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a   to copy cached.
1fd20 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61    ** values to a
1fd30 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a  n OP_Copy..  */.
1fd40 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a    if( regHit ){.
1fd50 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20      addrHitTest 
1fd60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1fd70 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
1fd80 67 48 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  gHit);.  }.  sql
1fd90 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
1fda0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
1fdb0 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
1fdc0 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
1fdd0 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
1fde0 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
1fdf0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1fe00 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
1fe10 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
1fe20 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
1fe30 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
1fe40 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
1fe50 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
1fe60 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74  );.  if( addrHit
1fe70 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Test ){.    sqli
1fe80 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1fe90 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b  v, addrHitTest);
1fea0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
1feb0 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78  d a single OP_Ex
1fec0 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
1fed0 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f  n to the VDBE to
1fee0 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c   explain a simpl
1fef0 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75  e.** count(*) qu
1ff00 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75  ery ("SELECT cou
1ff10 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22  nt(*) FROM pTab"
1ff20 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  )..*/.#ifndef SQ
1ff30 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
1ff40 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  N.static void ex
1ff50 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
1ff60 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1ff70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1ff80 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
1ff90 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
1ffa0 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
1ffb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
1ffc0 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
1ffd0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
1ffe0 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
1fff0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
20000 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
20010 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  scan, or NULL */
20020 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
20030 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
20040 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d      char *zEqp =
20050 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
20060 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41  pParse->db, "SCA
20070 4e 20 54 41 42 4c 45 20 25 73 20 25 73 25 73 28  N TABLE %s %s%s(
20080 7e 25 64 20 72 6f 77 73 29 22 2c 0a 20 20 20 20  ~%d rows)",.    
20090 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
200a0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f   .        pIdx ?
200b0 20 22 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47   "USING COVERING
200c0 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20   INDEX " : "",. 
200d0 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 70 49         pIdx ? pI
200e0 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 2c 0a  dx->zName : "",.
200f0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52          pTab->nR
20100 6f 77 45 73 74 0a 20 20 20 20 29 3b 0a 20 20 20  owEst.    );.   
20110 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20120 70 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  p4(.        pPar
20130 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78  se->pVdbe, OP_Ex
20140 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
20150 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
20160 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zEqp, P4_DYNAMIC
20170 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .    );.  }.}.#e
20180 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
20190 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
201a0 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
201b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
201c0 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  de for the SELEC
201d0 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  T statement give
201e0 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d  n in the p argum
201f0 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ent.  .**.** The
20200 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73   results are dis
20210 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72 69  tributed in vari
20220 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64 69  ous ways dependi
20230 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 6e  ng on the.** con
20240 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65 6c  tents of the Sel
20250 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
20260 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
20270 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a 2a  argument pDest.*
20280 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  * as follows:.**
20290 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e 65  .**     pDest->e
202a0 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a 2a  Dest    Result.*
202b0 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *     ----------
202c0 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
202d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
202e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
202f0 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4f 75 74  -.**     SRT_Out
20300 70 75 74 20 20 20 20 20 20 47 65 6e 65 72 61 74  put      Generat
20310 65 20 61 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  e a row of outpu
20320 74 20 28 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  t (using the OP_
20330 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20 20 20 20  ResultRow.**    
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20350 20 6f 70 63 6f 64 65 29 20 66 6f 72 20 65 61 63   opcode) for eac
20360 68 20 72 6f 77 20 69 6e 20 74 68 65 20 72 65 73  h row in the res
20370 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20  ult set..**.**  
20380 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20 20     SRT_Mem      
20390 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69 66     Only valid if
203a0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   the result is a
203b0 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 0a   single column..
203c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
203d0 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68 65         Store the
203e0 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
203f0 20 74 68 65 20 66 69 72 73 74 20 72 65 73 75 6c   the first resul
20400 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  t row.**        
20410 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
20420 72 65 67 69 73 74 65 72 20 70 44 65 73 74 2d 3e  register pDest->
20430 69 53 44 50 61 72 6d 20 74 68 65 6e 20 61 62 61  iSDParm then aba
20440 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a 2a  ndon the rest.**
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20460 20 20 20 20 20 6f 66 20 74 68 65 20 71 75 65 72       of the quer
20470 79 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e 61  y.  This destina
20480 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c 49  tion implies "LI
20490 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  MIT 1"..**.**   
204a0 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20    SRT_Set       
204b0 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75 73    The result mus
204c0 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63 6f  t be a single co
204d0 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61 63  lumn.  Store eac
204e0 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  h.**            
204f0 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66 20           row of 
20500 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b 65  result as the ke
20510 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73 74  y in table pDest
20520 2d 3e 69 53 44 50 61 72 6d 2e 20 0a 2a 2a 20 20  ->iSDParm. .**  
20530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20540 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66     Apply the aff
20550 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66  inity pDest->aff
20560 53 64 73 74 20 62 65 66 6f 72 65 20 73 74 6f 72  Sdst before stor
20570 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
20580 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
20590 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d 70  ts.  Used to imp
205a0 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c 45  lement "IN (SELE
205b0 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20  CT ...)"..**.** 
205c0 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
205d0 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
205e0 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
205f0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
20600 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20610 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69          identifi
20620 65 64 20 62 79 20 70 44 65 73 74 2d 3e 69 53 44  ed by pDest->iSD
20630 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
20640 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20  SRT_Except      
20650 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66  Remove results f
20660 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rom the temporar
20670 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
20680 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20  SDParm..**.**   
20690 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20    SRT_Table     
206a0 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
206b0 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  in temporary tab
206c0 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  le pDest->iSDPar
206d0 6d 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  m..**           
206e0 20 20 20 20 20 20 20 20 20 20 54 68 69 73 20 69            This i
206f0 73 20 6c 69 6b 65 20 53 52 54 5f 45 70 68 65 6d  s like SRT_Ephem
20700 54 61 62 20 65 78 63 65 70 74 20 74 68 61 74 20  Tab except that 
20710 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  the table.**    
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20730 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 61   is assumed to a
20740 6c 72 65 61 64 79 20 62 65 20 6f 70 65 6e 2e 0a  lready be open..
20750 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 70  **.**     SRT_Ep
20760 68 65 6d 54 61 62 20 20 20 20 43 72 65 61 74 65  hemTab    Create
20770 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   an temporary ta
20780 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ble pDest->iSDPa
20790 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20  rm and store.** 
207a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207b0 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 20 74      the result t
207c0 68 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f 72  here. The cursor
207d0 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61 66   is left open af
207e0 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ter.**          
207f0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
20800 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 6c  ning.  This is l
20810 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20 65 78  ike SRT_Table ex
20820 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20 20 20  cept that.**    
20830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20840 20 74 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f   this destinatio
20850 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e 45 70  n uses OP_OpenEp
20860 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65 61 74  hemeral to creat
20870 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
20880 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
20890 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20  le first..**.** 
208a0 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e      SRT_Coroutin
208b0 65 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 63  e   Generate a c
208c0 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72  o-routine that r
208d0 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72 6f 77  eturns a new row
208e0 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
208f0 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
20900 74 73 20 65 61 63 68 20 74 69 6d 65 20 69 74 20  ts each time it 
20910 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68 65  is invoked.  The
20920 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a 2a 20   entry point.** 
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20940 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f      of the co-ro
20950 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65 64 20  utine is stored 
20960 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73  in register pDes
20970 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a  t->iSDParm..**.*
20980 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74 73  *     SRT_Exists
20990 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31 20        Store a 1 
209a0 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70  in memory cell p
209b0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 69 66  Dest->iSDParm if
209c0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20   the result.**  
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209e0 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d     set is not em
209f0 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  pty..**.**     S
20a00 52 54 5f 44 69 73 63 61 72 64 20 20 20 20 20 54  RT_Discard     T
20a10 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73  hrow the results
20a20 20 61 77 61 79 2e 20 20 54 68 69 73 20 69 73 20   away.  This is 
20a30 75 73 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a  used by SELECT.*
20a40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
20a50 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73        statements
20a60 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73   within triggers
20a70 20 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70   whose only purp
20a80 6f 73 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ose is.**       
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
20aa0 65 20 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f  e side-effects o
20ab0 66 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a  f functions..**.
20ac0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20ad0 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
20ae0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
20af0 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
20b00 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
20b10 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
20b20 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
20b30 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
20b40 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
20b50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
20b60 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
20b70 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
20b80 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
20b90 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
20ba0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
20bb0 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  s to do that..*/
20bc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
20bd0 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
20be0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
20bf0 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
20c00 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
20c10 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
20c20 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
20c30 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
20c40 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ed. */.  SelectD
20c50 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20  est *pDest      
20c60 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
20c70 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73  th the query res
20c80 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
20c90 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
20ca0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
20cb0 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
20cc0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
20cd0 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
20ce0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
20cf0 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
20d00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20d10 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
20d20 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
20d30 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
20d40 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
20d50 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
20d60 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
20d70 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
20d80 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
20d90 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69  List;      /* Li
20da0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
20db0 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
20dc0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
20dd0 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
20de0 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
20df0 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
20e00 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
20e10 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
20e20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
20e30 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
20e40 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
20e50 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
20e60 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
20e70 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
20e80 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
20e90 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
20ea0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
20eb0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
20ec0 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
20ed0 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
20ee0 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
20ef0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69   NULL */.  int i
20f00 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
20f10 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
20f20 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
20f30 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
20f40 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20    int distinct; 
20f50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
20f60 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  e to use for the
20f70 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f   distinct set */
20f80 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
20f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
20fa0 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
20fb0 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
20fc0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72  */.  int addrSor
20fd0 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41  tIndex;     /* A
20fe0 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f  ddress of an OP_
20ff0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
21000 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
21010 6e 74 20 61 64 64 72 44 69 73 74 69 6e 63 74 49  nt addrDistinctI
21020 6e 64 65 78 3b 20 2f 2a 20 41 64 64 72 65 73 73  ndex; /* Address
21030 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70   of an OP_OpenEp
21040 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
21050 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  ion */.  AggInfo
21060 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
21070 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
21080 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
21090 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
210a0 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
210b0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
210c0 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
210d0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
210e0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
210f0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
21100 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
21110 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
21120 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
21130 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c   int iRestoreSel
21140 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
21150 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61  iSelectId;.  pPa
21160 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d  rse->iSelectId =
21170 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
21180 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  lectId++;.#endif
21190 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
211a0 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  >db;.  if( p==0 
211b0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
211c0 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
211d0 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Err ){.    retur
211e0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
211f0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
21200 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
21210 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
21220 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
21230 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
21240 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
21250 66 6f 29 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e  fo));..  if( Ign
21260 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
21270 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65  est) ){.    asse
21280 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  rt(pDest->eDest=
21290 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70  =SRT_Exists || p
212a0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
212b0 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20  _Union || .     
212c0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
212d0 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c  st==SRT_Except |
212e0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
212f0 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20  SRT_Discard);.  
21300 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59    /* If ORDER BY
21310 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72   makes no differ
21320 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70  ence in the outp
21330 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20  ut then neither 
21340 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54  does.    ** DIST
21350 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62  INCT so it can b
21360 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a  e removed too. *
21370 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  /.    sqlite3Exp
21380 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
21390 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
213a0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
213b0 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  0;.    p->selFla
213c0 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
213d0 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ct;.  }.  sqlite
213e0 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
213f0 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72  se, p, 0);.  pOr
21400 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
21410 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  rBy;.  pTabList 
21420 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
21430 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
21440 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
21450 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
21460 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
21470 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
21480 20 20 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70    }.  isAgg = (p
21490 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
214a0 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
214b0 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
214c0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  =0 );..  /* Begi
214d0 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
214e0 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
214f0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
21500 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
21510 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
21520 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  nd;..  /* If wri
21530 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
21540 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
21550 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
21560 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
21570 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
21580 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21590 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
215a0 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74  if( checkForMult
215b0 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72  iColumnSelectErr
215c0 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  or(pParse, pDest
215d0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
215e0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
215f0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
21600 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
21610 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
21620 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
21630 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
21640 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
21650 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
21660 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
21670 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
21680 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20  IEW).  for(i=0; 
21690 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c  !p->pPrior && i<
216a0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
216b0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
216c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
216d0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
216e0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
216f0 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
21700 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
21710 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pItem->pSelect;.
21720 20 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62      int isAggSub
21730 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  ;..    if( pSub=
21740 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
21750 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64     if( pItem->ad
21760 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20  drFillSub ){.   
21770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21780 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
21790 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
217a0 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rn, pItem->addrF
217b0 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 63  illSub);.      c
217c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
217d0 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
217e0 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62   Parse.nHeight b
217f0 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  y the height of 
21800 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72  the largest expr
21810 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72  ession.    ** tr
21820 65 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79  ee refered to by
21830 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e   this, the paren
21840 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68  t select. The ch
21850 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a  ild select.    *
21860 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78  * may contain ex
21870 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f  pression trees o
21880 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a  f at most.    **
21890 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50   (SQLITE_MAX_EXP
218a0 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48  R_DEPTH-Parse.nH
218b0 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54  eight) height. T
218c0 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20  his is a bit.   
218d0 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76   ** more conserv
218e0 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73  ative than neces
218f0 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65  sary, but much e
21900 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72  asier than enfor
21910 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65  cing.    ** an e
21920 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20  xact limit..    
21930 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
21940 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65  Height += sqlite
21950 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
21960 74 28 70 29 3b 0a 0a 20 20 20 20 69 73 41 67 67  t(p);..    isAgg
21970 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c  Sub = (pSub->sel
21980 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
21990 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66  gate)!=0;.    if
219a0 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  ( flattenSubquer
219b0 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20  y(pParse, p, i, 
219c0 69 73 41 67 67 2c 20 69 73 41 67 67 53 75 62 29  isAgg, isAggSub)
219d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
219e0 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62  s subquery can b
219f0 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20  e absorbed into 
21a00 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20  its parent. */. 
21a10 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75       if( isAggSu
21a20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41  b ){.        isA
21a30 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gg = 1;.        
21a40 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
21a50 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20  F_Aggregate;.   
21a60 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d     }.      i = -
21a70 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
21a80 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
21a90 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
21aa0 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65  t will fill an e
21ab0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
21ac0 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ith.      ** the
21ad0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
21ae0 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65   subquery.  pIte
21af0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77  m->addrFillSub w
21b00 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20  ill point.      
21b10 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73  ** to the addres
21b20 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74  s of the generat
21b30 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ed subroutine.  
21b40 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
21b50 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72  .      ** is a r
21b60 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65  egister allocate
21b70 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75  d to hold the su
21b80 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
21b90 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f  address.      */
21ba0 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64  .      int topAd
21bb0 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e  dr;.      int on
21bc0 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  ceAddr = 0;.    
21bd0 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20    int retAddr;. 
21be0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
21bf0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d  em->addrFillSub=
21c00 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65  =0 );.      pIte
21c10 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
21c20 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
21c30 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73       topAddr = s
21c40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21c50 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
21c60 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  0, pItem->regRet
21c70 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65  urn);.      pIte
21c80 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
21c90 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20   topAddr+1;.    
21ca0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
21cb0 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
21cc0 7a 65 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  ze %s", pItem->p
21cd0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
21ce0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
21cf0 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29  sCorrelated==0 )
21d00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
21d10 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
21d20 6e 6f 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e  no correlated an
21d30 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  d if we are not 
21d40 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20  inside of.      
21d50 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20    ** a trigger, 
21d60 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65  then we only nee
21d70 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
21d80 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75   value of the su
21d90 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a  bquery.        *
21da0 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20  * once. */.     
21db0 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71     onceAddr = sq
21dc0 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
21dd0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
21de0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
21df0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
21e00 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20  , SRT_EphemTab, 
21e10 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
21e20 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
21e30 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e  tInteger(pItem->
21e40 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70  iSelectId, (u8)p
21e50 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
21e60 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ctId);.      sql
21e70 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
21e80 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
21e90 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
21ea0 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28 75  ab->nRowEst = (u
21eb0 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e 53  nsigned)pSub->nS
21ec0 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
21ed0 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73  if( onceAddr ) s
21ee0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
21ef0 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b  re(v, onceAddr);
21f00 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d  .      retAddr =
21f10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21f20 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
21f30 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
21f40 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  n);.      VdbeCo
21f50 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25  mment((v, "end %
21f60 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
21f70 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
21f80 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
21f90 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20  eP1(v, topAddr, 
21fa0 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20  retAddr);.      
21fb0 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
21fc0 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
21fd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
21fe0 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  /*pParse->nErr |
21ff0 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  |*/ db->mallocFa
22000 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67 6f  iled ){.      go
22010 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
22020 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
22030 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69  >nHeight -= sqli
22040 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
22050 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61 62  ght(p);.    pTab
22060 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
22070 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62      if( !Ignorab
22080 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
22090 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65 72   ){.      pOrder
220a0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
220b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 45  ;.    }.  }.  pE
220c0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
220d0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65 72  ;.#endif.  pWher
220e0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
220f0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
22100 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
22110 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
22120 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20  .  isDistinct = 
22130 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
22140 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a  F_Distinct)!=0;.
22150 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22160 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
22170 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65  LECT.  /* If the
22180 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75  re is are a sequ
22190 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c  ence of queries,
221a0 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20   do the earlier 
221b0 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f  ones first..  */
221c0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
221d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   ){.    if( p->p
221e0 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a  Rightmost==0 ){.
221f0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c        Select *pL
22200 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d 20 30  oop, *pRight = 0
22210 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  ;.      int cnt 
22220 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d  = 0;.      int m
22230 78 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 66  xSelect;.      f
22240 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f  or(pLoop=p; pLoo
22250 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
22260 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a  pPrior, cnt++){.
22270 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70          pLoop->p
22280 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20  Rightmost = p;. 
22290 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e         pLoop->pN
222a0 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ext = pRight;.  
222b0 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
222c0 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Loop;.      }.  
222d0 20 20 20 20 6d 78 53 65 6c 65 63 74 20 3d 20 64      mxSelect = d
222e0 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
222f0 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
22300 53 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20 69  SELECT];.      i
22310 66 28 20 6d 78 53 65 6c 65 63 74 20 26 26 20 63  f( mxSelect && c
22320 6e 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20  nt>mxSelect ){. 
22330 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
22340 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
22350 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
22360 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  n compound SELEC
22370 54 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  T");.        got
22380 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
22390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
223a0 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
223b0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
223c0 74 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53  t);.    explainS
223d0 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  etInteger(pParse
223e0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65  ->iSelectId, iRe
223f0 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a  storeSelectId);.
22400 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22410 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
22420 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
22430 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20   a GROUP BY and 
22440 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
22450 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a  se and they are.
22460 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20    ** identical, 
22470 74 68 65 6e 20 64 69 73 61 62 6c 65 20 74 68 65  then disable the
22480 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
22490 20 73 69 6e 63 65 20 74 68 65 20 47 52 4f 55 50   since the GROUP
224a0 20 42 59 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 61   BY.  ** will ca
224b0 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20  use elements to 
224c0 63 6f 6d 65 20 6f 75 74 20 69 6e 20 74 68 65 20  come out in the 
224d0 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 20  correct order.  
224e0 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 6e 20  This is.  ** an 
224f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74  optimization - t
22500 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
22510 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20  r should result 
22520 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 2a 2a  regardless..  **
22530 20 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f   Use the SQLITE_
22540 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61  GroupByOrder fla
22550 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45  g with SQLITE_TE
22560 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52  STCTRL_OPTIMIZER
22570 0a 20 20 2a 2a 20 74 6f 20 64 69 73 61 62 6c 65  .  ** to disable
22580 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
22590 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  on for testing p
225a0 75 72 70 6f 73 65 73 2e 0a 20 20 2a 2f 0a 20 20  urposes..  */.  
225b0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
225c0 69 73 74 43 6f 6d 70 61 72 65 28 70 2d 3e 70 47  istCompare(p->pG
225d0 72 6f 75 70 42 79 2c 20 70 4f 72 64 65 72 42 79  roupBy, pOrderBy
225e0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
225f0 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
22600 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
22610 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 72  r)==0 ){.    pOr
22620 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a  derBy = 0;.  }..
22630 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
22640 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69  y is DISTINCT wi
22650 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62  th an ORDER BY b
22660 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ut is not an agg
22670 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a  regate, and .  *
22680 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d  * if the select-
22690 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65  list is the same
226a0 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59   as the ORDER BY
226b0 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73   list, then this
226c0 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20   query.  ** can 
226d0 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  be rewritten as 
226e0 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f  a GROUP BY. In o
226f0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73  ther words, this
22700 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
22710 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
22720 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44  xyz FROM ... ORD
22730 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
22740 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d   ** is transform
22750 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ed to:.  **.  **
22760 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20       SELECT xyz 
22770 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42  FROM ... GROUP B
22780 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Y xyz.  **.  ** 
22790 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
227a0 69 73 20 70 72 65 66 65 72 72 65 64 20 61 73 20  is preferred as 
227b0 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28  a single index (
227c0 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d  or temp-table) m
227d0 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64  ay be .  ** used
227e0 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52   for both the OR
227f0 44 45 52 20 42 59 20 61 6e 64 20 44 49 53 54 49  DER BY and DISTI
22800 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  NCT processing. 
22810 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20  As originally . 
22820 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20   ** written the 
22830 71 75 65 72 79 20 6d 75 73 74 20 75 73 65 20 61  query must use a
22840 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20   temp-table for 
22850 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
22860 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20  the ORDER .  ** 
22870 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c  BY and DISTINCT,
22880 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72   and an index or
22890 20 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74   separate temp-t
228a0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68  able for the oth
228b0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
228c0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
228d0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
228e0 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
228f0 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71  stinct .   && sq
22900 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
22910 70 61 72 65 28 70 4f 72 64 65 72 42 79 2c 20 70  pare(pOrderBy, p
22920 2d 3e 70 45 4c 69 73 74 29 3d 3d 30 0a 20 20 29  ->pEList)==0.  )
22930 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  {.    p->selFlag
22940 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
22950 74 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70  t;.    p->pGroup
22960 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
22970 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
22980 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70  EList, 0);.    p
22990 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
229a0 6f 75 70 42 79 3b 0a 20 20 20 20 70 4f 72 64 65  oupBy;.    pOrde
229b0 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
229c0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
229d0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
229e0 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72  e, then this sor
229f0 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
22a00 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69  might end up bei
22a10 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65  ng unused if the
22a20 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20   data can be .  
22a30 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20  ** extracted in 
22a40 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72  pre-sorted order
22a50 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
22a60 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
22a70 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68  .  ** OP_OpenEph
22a80 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
22a90 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  on will be chang
22aa0 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70  ed to an OP_Noop
22ab0 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69   once.  ** we fi
22ac0 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
22ad0 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
22ae0 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20  is not needed.  
22af0 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65  The addrSortInde
22b00 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20  x.  ** variable 
22b10 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c  is used to facil
22b20 69 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67  itate that chang
22b30 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
22b40 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
22b50 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
22b60 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
22b70 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
22b80 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
22b90 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65  erBy);.    pOrde
22ba0 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
22bb0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
22bc0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
22bd0 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72  phm[2] = addrSor
22be0 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
22bf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
22c00 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
22c10 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
22c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c30 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
22c40 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  sor, pOrderBy->n
22c50 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c70 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
22c80 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
22c90 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65  O_HANDOFF);.  }e
22ca0 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72  lse{.    addrSor
22cb0 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d  tIndex = -1;.  }
22cc0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
22cd0 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
22ce0 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
22cf0 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
22d00 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
22d10 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
22d20 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
22d30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
22d40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
22d50 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65  enEphemeral, pDe
22d60 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c  st->iSDParm, pEL
22d70 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
22d80 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c  ..  /* Set the l
22d90 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  imiter..  */.  i
22da0 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
22db0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
22dc0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
22dd0 20 28 64 6f 75 62 6c 65 29 4c 41 52 47 45 53 54   (double)LARGEST
22de0 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74  _INT64;.  comput
22df0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
22e00 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
22e10 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
22e20 74 3d 3d 30 20 26 26 20 61 64 64 72 53 6f 72 74  t==0 && addrSort
22e30 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20  Index>=0 ){.    
22e40 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
22e50 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
22e60 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  x)->opcode = OP_
22e70 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20 20 20  SorterOpen;.    
22e80 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
22e90 46 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  F_UseSorter;.  }
22ea0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69  ..  /* Open a vi
22eb0 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
22ec0 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
22ed0 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
22ee0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
22ef0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
22f00 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
22f10 65 79 49 6e 66 6f 3b 0a 20 20 20 20 64 69 73 74  eyInfo;.    dist
22f20 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
22f30 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49  Tab++;.    pKeyI
22f40 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
22f50 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
22f60 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
22f70 20 20 61 64 64 72 44 69 73 74 69 6e 63 74 49 6e    addrDistinctIn
22f80 64 65 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dex = sqlite3Vdb
22f90 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
22fa0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69 73  enEphemeral, dis
22fb0 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
22fc0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
22fd0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
22fe0 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 73  _HANDOFF);.    s
22ff0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
23000 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
23010 44 45 52 45 44 29 3b 0a 20 20 7d 65 6c 73 65 7b  DERED);.  }else{
23020 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
23030 61 64 64 72 44 69 73 74 69 6e 63 74 49 6e 64 65  addrDistinctInde
23040 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
23050 2a 20 41 67 67 72 65 67 61 74 65 20 61 6e 64 20  * Aggregate and 
23060 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
23070 65 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65  eries are handle
23080 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f  d differently */
23090 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
230a0 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
230b0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44      ExprList *pD
230c0 69 73 74 20 3d 20 28 69 73 44 69 73 74 69 6e 63  ist = (isDistinc
230d0 74 20 3f 20 70 2d 3e 70 45 4c 69 73 74 20 3a 20  t ? p->pEList : 
230e0 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69  0);..    /* Begi
230f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
23100 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e  can. */.    pWIn
23110 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
23120 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
23130 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
23140 20 26 70 4f 72 64 65 72 42 79 2c 20 70 44 69 73   &pOrderBy, pDis
23150 74 2c 20 30 2c 30 29 3b 0a 20 20 20 20 69 66 28  t, 0,0);.    if(
23160 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
23170 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
23180 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 52    if( pWInfo->nR
23190 6f 77 4f 75 74 20 3c 20 70 2d 3e 6e 53 65 6c 65  owOut < p->nSele
231a0 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
231b0 63 74 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d 3e  ctRow = pWInfo->
231c0 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 20 20 2f 2a  nRowOut;..    /*
231d0 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65   If sorting inde
231e0 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74  x that was creat
231f0 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50  ed by a prior OP
23200 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a  _OpenEphemeral .
23210 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
23220 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20  on ended up not 
23230 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68  being needed, th
23240 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  en change the OP
23250 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20  _OpenEphemeral. 
23260 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50     ** into an OP
23270 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Noop..    */.  
23280 20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e    if( addrSortIn
23290 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72  dex>=0 && pOrder
232a0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
232b0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
232c0 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
232d0 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  rtIndex);.      
232e0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
232f0 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  2] = -1;.    }..
23300 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
23310 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  eDistinct ){.   
23320 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20     VdbeOp *pOp; 
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23340 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75  * No longer requ
23350 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65 72  ired OpenEphemer
23360 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20  al instr. */.   
23370 20 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28    .      assert(
23380 20 61 64 64 72 44 69 73 74 69 6e 63 74 49 6e 64   addrDistinctInd
23390 65 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ex>=0 );.      p
233a0 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
233b0 47 65 74 4f 70 28 76 2c 20 61 64 64 72 44 69 73  GetOp(v, addrDis
233c0 74 69 6e 63 74 49 6e 64 65 78 29 3b 0a 0a 20 20  tinctIndex);..  
233d0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 44 69      assert( isDi
233e0 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
233f0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
23400 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45  eDistinct==WHERE
23410 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
23420 44 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  D .           ||
23430 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
23440 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  ct==WHERE_DISTIN
23450 43 54 5f 55 4e 49 51 55 45 20 0a 20 20 20 20 20  CT_UNIQUE .     
23460 20 29 3b 0a 20 20 20 20 20 20 64 69 73 74 69 6e   );.      distin
23470 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  ct = -1;.      i
23480 66 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  f( pWInfo->eDist
23490 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54  inct==WHERE_DIST
234a0 49 4e 43 54 5f 4f 52 44 45 52 45 44 20 29 7b 0a  INCT_ORDERED ){.
234b0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d          int iJum
234c0 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  p;.        int i
234d0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  Expr;.        in
234e0 74 20 69 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  t iFlag = ++pPar
234f0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
23500 20 20 69 6e 74 20 69 42 61 73 65 20 3d 20 70 50    int iBase = pP
23510 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
23520 20 20 20 20 20 20 69 6e 74 20 69 42 61 73 65 32        int iBase2
23530 20 3d 20 69 42 61 73 65 20 2b 20 70 45 4c 69 73   = iBase + pELis
23540 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
23550 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
23560 3d 20 28 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  = (pEList->nExpr
23570 2a 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  *2);..        /*
23580 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   Change the OP_O
23590 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64  penEphemeral cod
235a0 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e  ed earlier to an
235b0 20 4f 50 5f 49 6e 74 65 67 65 72 2e 20 54 68 65   OP_Integer. The
235c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 49  .        ** OP_I
235d0 6e 74 65 67 65 72 20 69 6e 69 74 69 61 6c 69 7a  nteger initializ
235e0 65 73 20 74 68 65 20 22 66 69 72 73 74 20 72 6f  es the "first ro
235f0 77 22 20 66 6c 61 67 2e 20 20 2a 2f 0a 20 20 20  w" flag.  */.   
23600 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
23610 20 3d 20 4f 50 5f 49 6e 74 65 67 65 72 3b 0a 20   = OP_Integer;. 
23620 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
23630 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   1;.        pOp-
23640 3e 70 32 20 3d 20 69 46 6c 61 67 3b 0a 0a 20 20  >p2 = iFlag;..  
23650 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23660 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
23670 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 69 42  arse, pEList, iB
23680 61 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ase, 1);.       
23690 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33   iJump = sqlite3
236a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
236b0 76 29 20 2b 20 31 20 2b 20 70 45 4c 69 73 74 2d  v) + 1 + pEList-
236c0 3e 6e 45 78 70 72 20 2b 20 31 20 2b 20 31 3b 0a  >nExpr + 1 + 1;.
236d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
236e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
236f0 49 66 2c 20 69 46 6c 61 67 2c 20 69 4a 75 6d 70  If, iFlag, iJump
23700 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  -1);.        for
23710 28 69 45 78 70 72 3d 30 3b 20 69 45 78 70 72 3c  (iExpr=0; iExpr<
23720 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
23730 45 78 70 72 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Expr++){.       
23740 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
23750 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
23760 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
23770 45 4c 69 73 74 2d 3e 61 5b 69 45 78 70 72 5d 2e  EList->a[iExpr].
23780 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
23790 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
237a0 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 69 42  Op3(v, OP_Ne, iB
237b0 61 73 65 2b 69 45 78 70 72 2c 20 69 4a 75 6d 70  ase+iExpr, iJump
237c0 2c 20 69 42 61 73 65 32 2b 69 45 78 70 72 29 3b  , iBase2+iExpr);
237d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
237e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
237f0 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  , -1, (const cha
23800 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
23810 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20  LLSEQ);.        
23820 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
23830 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
23840 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20  NULLEQ);.       
23850 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
23860 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
23870 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e  OP_Goto, 0, pWIn
23880 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  fo->iContinue);.
23890 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
238a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
238b0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 46 6c  _Integer, 0, iFl
238c0 61 67 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ag);.        ass
238d0 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
238e0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d  CurrentAddr(v)==
238f0 69 4a 75 6d 70 20 29 3b 0a 20 20 20 20 20 20 20  iJump );.       
23900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23910 70 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69  p3(v, OP_Move, i
23920 42 61 73 65 2c 20 69 42 61 73 65 32 2c 20 70 45  Base, iBase2, pE
23930 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
23940 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23950 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
23960 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
23970 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
23980 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
23990 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a   inner loop. */.
239a0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
239b0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
239c0 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
239d0 64 65 72 42 79 2c 20 64 69 73 74 69 6e 63 74 2c  derBy, distinct,
239e0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
239f0 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
23a00 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70  fo->iContinue, p
23a10 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
23a20 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  .    /* End the 
23a30 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
23a40 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  op..    */.    s
23a50 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
23a60 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  WInfo);.  }else{
23a70 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
23a80 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66  the processing f
23a90 6f 72 20 61 67 67 72 65 67 61 74 65 20 71 75 65  or aggregate que
23aa0 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65  ries */.    Name
23ab0 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
23ac0 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
23ad0 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61  for processing a
23ae0 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61  ggregate informa
23af0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tion */.    int 
23b00 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iAMem;          
23b10 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
23b20 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67  ress for storing
23b30 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
23b40 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d  Y */.    int iBM
23b50 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
23b60 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
23b70 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47  s for previous G
23b80 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
23b90 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20  nt iUseFlag;    
23ba0 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
23bb0 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69  s holding flag i
23bc0 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
23bd0 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bf0 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  ** one row of th
23c00 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61  e input to the a
23c10 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65  ggregator has be
23c20 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  en.             
23c30 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72             ** pr
23c40 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69  ocessed */.    i
23c50 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20  nt iAbortFlag;  
23c60 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
23c70 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71  s which causes q
23c80 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f  uery abort if po
23c90 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e  sitive */.    in
23ca0 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20  t groupBySort;  
23cb0 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66    /* Rows come f
23cc0 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52  rom source in GR
23cd0 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a  OUP BY order */.
23ce0 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b      int addrEnd;
23cf0 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
23d00 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  f processing for
23d10 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a   this SELECT */.
23d20 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62      int sortPTab
23d30 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64   = 0;   /* Pseud
23d40 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64  otable used to d
23d50 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65  ecode sorting re
23d60 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  sults */.    int
23d70 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20   sortOut = 0;   
23d80 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73   /* Output regis
23d90 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72  ter from the sor
23da0 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ter */..    /* R
23db0 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c  emove any and al
23dc0 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65  l aliases betwee
23dd0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
23de0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
23df0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
23e00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
23e10 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
23e20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
23e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e40 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
23e50 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
23e60 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
23e70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f  Item;  /* For lo
23e80 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65  oping over expre
23e90 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20  ssion in a list 
23ea0 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  */..      for(k=
23eb0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
23ec0 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73  , pItem=p->pELis
23ed0 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  t->a; k>0; k--, 
23ee0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
23ef0 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20    pItem->iAlias 
23f00 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
23f10 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42     for(k=pGroupB
23f20 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  y->nExpr, pItem=
23f30 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30  pGroupBy->a; k>0
23f40 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
23f50 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
23f60 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
23f70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
23f80 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28 64 6f 75  >nSelectRow>(dou
23f90 62 6c 65 29 31 30 30 20 29 20 70 2d 3e 6e 53 65  ble)100 ) p->nSe
23fa0 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c  lectRow = (doubl
23fb0 65 29 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e)100;.    }else
23fc0 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
23fd0 63 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29  ctRow = (double)
23fe0 31 3b 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20  1;.    }.. .    
23ff0 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65  /* Create a labe
24000 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65  l to jump to whe
24010 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f  n we want to abo
24020 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  rt the query */.
24030 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71      addrEnd = sq
24040 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
24050 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  el(v);..    /* C
24060 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e  onvert TK_COLUMN
24070 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41   nodes into TK_A
24080 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61  GG_COLUMN and ma
24090 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ke entries in.  
240a0 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f    ** sAggInfo fo
240b0 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e  r all TK_AGG_FUN
240c0 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65  CTION nodes in e
240d0 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
240e0 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  e.    ** SELECT 
240f0 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a  statement..    *
24100 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
24110 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
24120 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  ));.    sNC.pPar
24130 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
24140 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
24150 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e  pTabList;.    sN
24160 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
24170 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67  ggInfo;.    sAgg
24180 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
24190 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f  umn = pGroupBy ?
241a0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
241b0 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67  +1 : 0;.    sAgg
241c0 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20  Info.pGroupBy = 
241d0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71  pGroupBy;.    sq
241e0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
241f0 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45  AggList(&sNC, pE
24200 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
24210 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
24220 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65  List(&sNC, pOrde
24230 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48  rBy);.    if( pH
24240 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  aving ){.      s
24250 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
24260 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43  eAggregates(&sNC
24270 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  , pHaving);.    
24280 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  }.    sAggInfo.n
24290 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41  Accumulator = sA
242a0 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a  ggInfo.nColumn;.
242b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
242c0 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69  AggInfo.nFunc; i
242d0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
242e0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
242f0 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75  rty(sAggInfo.aFu
24300 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  nc[i].pExpr, EP_
24310 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
24320 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
24330 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  |= NC_InAggFunc;
24340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
24350 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
24360 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e  (&sNC, sAggInfo.
24370 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e  aFunc[i].pExpr->
24380 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
24390 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e  sNC.ncFlags &= ~
243a0 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
243b0 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
243c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
243d0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
243e0 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69  .    /* Processi
243f0 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
24400 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20  s with GROUP BY 
24410 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e  is very differen
24420 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63  t and.    ** muc
24430 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74  h more complex t
24440 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77  han aggregates w
24450 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
24460 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  Y..    */.    if
24470 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
24480 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
24490 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e  yInfo;  /* Keyin
244a0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
244b0 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63  r the group by c
244c0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
244d0 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
244e0 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d     /* A-vs-B com
244f0 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f  parision jump */
24500 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f  .      int addrO
24510 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74  utputRow;  /* St
24520 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e  art of subroutin
24530 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
24540 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20   result row */. 
24550 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70       int regOutp
24560 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75  utRow;   /* Retu
24570 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
24580 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73  ter for output s
24590 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  ubroutine */.   
245a0 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62     int addrSetAb
245b0 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68  ort;   /* Set th
245c0 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64  e abort flag and
245d0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20   return */.     
245e0 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
245f0 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  op;  /* Top of t
24600 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
24610 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
24620 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68  ortingIdx; /* Th
24630 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
24640 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69  al for the sorti
24650 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
24660 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b    int addrReset;
24670 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
24680 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e  ine for resettin
24690 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
246a0 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  r */.      int r
246b0 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f  egReset;       /
246c0 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
246d0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65   register for re
246e0 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  set subroutine *
246f0 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  /..      /* If t
24700 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20  here is a GROUP 
24710 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67  BY clause we mig
24720 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e  ht need a sortin
24730 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20  g index to.     
24740 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74   ** implement it
24750 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74  .  Allocate that
24760 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e   sorting index n
24770 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73  ow.  If it turns
24780 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   out.      ** th
24790 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  at we do not nee
247a0 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20  d it after all, 
247b0 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
247c0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20  n instruction.  
247d0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63      ** will be c
247e0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
247f0 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f  Noop.  .      */
24800 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  .      sAggInfo.
24810 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61  sortingIdx = pPa
24820 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
24830 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
24840 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
24850 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
24860 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53  By);.      addrS
24870 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69  ortingIdx = sqli
24880 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
24890 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
248a0 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
248b0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
248c0 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
248d0 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20  gColumn, .      
248e0 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b      0, (char*)pK
248f0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
24900 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20  FO_HANDOFF);..  
24910 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
24920 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
24930 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
24940 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
24950 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
24960 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
24970 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
24980 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  m;.      iAbortF
24990 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
249a0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f  nMem;.      regO
249b0 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61  utputRow = ++pPa
249c0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
249d0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
249e0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
249f0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
24a00 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61  regReset = ++pPa
24a10 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
24a20 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
24a30 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
24a40 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65  l(v);.      iAMe
24a50 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
24a60 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
24a70 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
24a80 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
24a90 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
24aa0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
24ab0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
24ac0 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
24ad0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
24ae0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
24af0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41  P_Integer, 0, iA
24b00 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
24b10 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
24b20 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
24b30 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
24b40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24b50 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
24b60 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
24b70 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
24b80 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75  , "indicate accu
24b90 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29  mulator empty"))
24ba0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24bb0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
24bc0 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20  Null, 0, iAMem, 
24bd0 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e  iAMem+pGroupBy->
24be0 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20  nExpr-1);..     
24bf0 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70   /* Begin a loop
24c00 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
24c10 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f  ct all source ro
24c20 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ws in GROUP BY o
24c30 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rder..      ** T
24c40 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76  his might involv
24c50 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c  e two separate l
24c60 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f  oops with an OP_
24c70 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c  Sort in between,
24c80 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   or.      ** it 
24c90 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c  might be a singl
24ca0 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73  e loop that uses
24cb0 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74   an index to ext
24cc0 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
24cd0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
24ce0 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20   right order to 
24cf0 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20  begin with..    
24d00 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
24d10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
24d20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
24d30 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
24d40 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
24d50 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
24d60 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
24d70 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f  t, pWhere, &pGro
24d80 75 70 42 79 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  upBy, 0, 0, 0);.
24d90 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
24da0 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
24db0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  t_end;.      if(
24dc0 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
24dd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
24de0 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65  ptimizer is able
24df0 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73   to deliver rows
24e00 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64   in group by ord
24e10 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a  er so.        **
24e20 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
24e30 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50  to sort.  The OP
24e40 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74  _OpenEphemeral t
24e50 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  able will be.   
24e60 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65       ** cancelle
24e70 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20  d later because 
24e80 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
24e90 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66   use the pKeyInf
24ea0 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  o.        */.   
24eb0 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20       pGroupBy = 
24ec0 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
24ed0 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
24ee0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
24ef0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  e{.        /* Ro
24f00 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75  ws are coming ou
24f10 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65  t in undetermine
24f20 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76  d order.  We hav
24f30 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20  e to push.      
24f40 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e    ** each row in
24f50 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
24f60 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ex, terminate th
24f70 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20  e first loop,.  
24f80 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f        ** then lo
24f90 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74  op over the sort
24fa0 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64  ing index in ord
24fb0 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75  er to get the ou
24fc0 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  tput.        ** 
24fd0 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a  in sorted order.
24fe0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
24ff0 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a     int regBase;.
25000 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52          int regR
25010 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69  ecord;.        i
25020 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt nCol;.       
25030 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a   int nGroupBy;..
25040 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54          explainT
25050 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
25060 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73   .            is
25070 44 69 73 74 69 6e 63 74 20 26 26 20 21 28 70 2d  Distinct && !(p-
25080 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73  >selFlags&SF_Dis
25090 74 69 6e 63 74 29 3f 22 44 49 53 54 49 4e 43 54  tinct)?"DISTINCT
250a0 22 3a 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a  ":"GROUP BY");..
250b0 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
250c0 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
250d0 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
250e0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
250f0 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
25100 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20  upBy + 1;.      
25110 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
25120 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
25130 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
25140 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
25150 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
25160 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
25170 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
25180 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
25190 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
251a0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
251b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
251c0 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
251d0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
251e0 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
251f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
25200 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
25210 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
25220 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
25230 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
25240 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65  GroupBy, regBase
25250 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
25260 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
25270 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
25280 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
25290 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f  Idx,regBase+nGro
252a0 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a  upBy);.        j
252b0 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20   = nGroupBy+1;. 
252c0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
252d0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
252e0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
252f0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
25300 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
25310 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
25320 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
25330 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
25340 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
25350 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a        int r1 = j
25360 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   + regBase;.    
25370 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a          int r2;.
25380 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32 20  .            r2 
25390 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
253a0 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
253b0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253d0 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
253e0 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
253f0 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20  ol->iTable, r1, 
25400 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
25410 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20  if( r1!=r2 ){.  
25420 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25430 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25440 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72   OP_SCopy, r2, r
25450 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
25460 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  }.            j+
25470 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
25480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25490 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
254a0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
254b0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
254c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
254d0 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
254e0 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
254f0 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
25500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
25510 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
25520 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67  orterInsert, sAg
25530 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
25540 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
25550 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
25560 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
25570 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
25580 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
25590 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
255a0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
255b0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
255c0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
255d0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
255e0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
255f0 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50  gIdxPTab = sortP
25600 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
25610 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f  ab++;.        so
25620 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47  rtOut = sqlite3G
25630 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
25640 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
25650 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
25660 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73  OP_OpenPseudo, s
25670 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74  ortPTab, sortOut
25680 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
25690 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
256a0 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
256b0 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
256c0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
256d0 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
256e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
256f0 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20  UP BY sort"));. 
25700 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
25710 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
25720 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
25730 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
25740 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
25750 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c  }..      /* Eval
25760 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  uate the current
25770 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
25780 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c  and store in b0,
25790 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20   b1, b2....     
257a0 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72   ** (b0 is memor
257b0 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d  y location iBMem
257c0 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b  +0, b1 is iBMem+
257d0 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  1, and so forth)
257e0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63  .      ** Then c
257f0 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65  ompare the curre
25800 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
25810 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52  s against the GR
25820 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20  OUP BY terms.   
25830 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
25840 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72  revious row curr
25850 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
25860 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20  a0, a1, a2....  
25870 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
25880 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c  rTopOfLoop = sql
25890 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
258a0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
258b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
258c0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
258d0 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
258e0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
258f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
25900 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
25910 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
25920 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75 74 29 3b  ngIdx, sortOut);
25930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
25940 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
25950 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
25960 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f  .        if( gro
25970 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
25980 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25990 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
259a0 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20  lumn, sortPTab, 
259b0 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  j, iBMem+j);.   
259c0 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20         if( j==0 
259d0 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ) sqlite3VdbeCha
259e0 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
259f0 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20 20  CLEARCACHE);.   
25a00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25a10 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64        sAggInfo.d
25a20 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
25a30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25a40 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
25a50 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e   pGroupBy->a[j].
25a60 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b  pExpr, iBMem+j);
25a70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25a80 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
25a90 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
25aa0 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c  _Compare, iAMem,
25ab0 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iBMem, pGroupBy
25ac0 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
25ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ae0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
25af0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
25b00 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  .      j1 = sqli
25b10 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
25b20 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
25b30 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
25b40 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c  , OP_Jump, j1+1,
25b50 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20   0, j1+1);..    
25b60 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
25b70 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65  de that runs whe
25b80 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20  never the GROUP 
25b90 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20  BY changes..    
25ba0 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20    ** Changes in 
25bb0 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65  the GROUP BY are
25bc0 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65   detected by the
25bd0 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20   previous code. 
25be0 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20       ** block.  
25bf0 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f  If there were no
25c00 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62   changes, this b
25c10 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e  lock is skipped.
25c20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
25c30 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70  ** This code cop
25c40 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75  ies current grou
25c50 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30  p by terms in b0
25c60 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20  ,b1,b2,....     
25c70 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61   ** over to a0,a
25c80 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63  1,a2.  It then c
25c90 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20  alls the output 
25ca0 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
25cb0 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74   ** and resets t
25cc0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
25cd0 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
25ce0 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  rs in preparatio
25cf0 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  n.      ** for t
25d00 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59  he next GROUP BY
25d10 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f   batch..      */
25d20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
25d30 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
25d40 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c  e, iBMem, iAMem,
25d50 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
25d60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25d70 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
25d80 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
25d90 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
25da0 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
25db0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
25dc0 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a  put one row"));.
25dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25de0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
25df0 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c  Pos, iAbortFlag,
25e00 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
25e10 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
25e20 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c   "check abort fl
25e30 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
25e40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25e50 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
25e60 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
25e70 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
25e80 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61  ent((v, "reset a
25e90 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
25ea0 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
25eb0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
25ec0 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64  cumulators based
25ed0 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   on the content 
25ee0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
25ef0 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20  current row.    
25f00 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
25f10 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
25f20 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64  , j1);.      upd
25f30 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
25f40 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
25f50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25f60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
25f70 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73  _Integer, 1, iUs
25f80 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
25f90 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
25fa0 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20  ndicate data in 
25fb0 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
25fc0 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  .      /* End of
25fd0 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20   the loop.      
25fe0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  */.      if( gro
25ff0 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
26000 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26010 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
26020 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  erNext, sAggInfo
26030 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
26040 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
26050 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26060 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
26070 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
26080 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
26090 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
260a0 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20  drSortingIdx);. 
260b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
260c0 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
260d0 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
260e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
260f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
26100 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
26110 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
26120 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
26130 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
26140 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
26150 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  row"));..      /
26160 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  * Jump over the 
26170 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20  subroutines.    
26180 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
26190 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
261a0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
261b0 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  End);..      /* 
261c0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
261d0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
261e0 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
261f0 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
26200 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
26210 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
26220 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
26230 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
26240 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
26250 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
26260 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
26270 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
26280 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
26290 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
262a0 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
262b0 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
262c0 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
262d0 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
262e0 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
262f0 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
26300 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
26310 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
26320 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
26330 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
26340 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
26350 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
26360 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
26370 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
26380 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
26390 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
263a0 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f  Integer, 1, iAbo
263b0 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
263c0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
263d0 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
263e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
263f0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
26400 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
26410 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  utRow);.      sq
26420 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
26430 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74  Label(v, addrOut
26440 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61  putRow);.      a
26450 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
26460 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
26470 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
26480 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26490 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
264a0 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
264b0 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20  putRow+2);.     
264c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
264d0 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74   "Groupby result
264e0 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79   generator entry
264f0 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20   point"));.     
26500 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26510 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
26520 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
26530 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
26540 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
26550 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
26560 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26570 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
26580 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74  pHaving, addrOut
26590 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45  putRow+1, SQLITE
265a0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
265b0 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
265c0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
265d0 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  ->pEList, 0, 0, 
265e0 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  pOrderBy,.      
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26600 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  distinct, pDest,
26610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26620 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75         addrOutpu
26630 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41  tRow+1, addrSetA
26640 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  bort);.      sql
26650 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
26660 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
26670 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
26680 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
26690 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72  , "end groupby r
266a0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
266b0 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
266c0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
266d0 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
266e0 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
266f0 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
26700 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
26710 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
26720 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74  bel(v, addrReset
26730 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
26740 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
26750 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
26760 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
26770 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
26780 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20  rn, regReset);. 
26790 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e      .    } /* en
267a0 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42  dif pGroupBy.  B
267b0 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71  egin aggregate q
267c0 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47  ueries without G
267d0 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20  ROUP BY: */.    
267e0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70  else {.      Exp
267f0 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b  rList *pDel = 0;
26800 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26810 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
26820 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
26830 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  b;.      if( (pT
26840 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75  ab = isSimpleCou
26850 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29  nt(p, &sAggInfo)
26860 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
26870 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f  /* If isSimpleCo
26880 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20  unt() returns a 
26890 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62  pointer to a Tab
268a0 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  le structure, th
268b0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
268c0 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
268d0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
268e0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
268f0 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63     **   SELECT c
26900 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
26910 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  l>.        **.  
26920 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74        ** where t
26930 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
26940 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72  re returned repr
26950 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62  esents table <tb
26960 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  l>..        **. 
26970 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73         ** This s
26980 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63  tatement is so c
26990 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73  ommon that it is
269a0 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69   optimized speci
269b0 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20  ally. The.      
269c0 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e    ** OP_Count in
269d0 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65  struction is exe
269e0 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20  cuted either on 
269f0 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65  the intkey table
26a00 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
26a10 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
26a20 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62  ta for table <tb
26a30 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20  l> or on one of 
26a40 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a  its indexes. It.
26a50 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65          ** is be
26a60 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20  tter to execute 
26a70 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64  the op on an ind
26a80 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61  ex, as indexes a
26a90 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20  re almost.      
26aa0 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65    ** always spre
26ab0 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70  ad across less p
26ac0 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20  ages than their 
26ad0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
26ae0 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bles..        */
26af0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
26b00 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
26b10 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
26b20 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
26b30 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
26b40 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72    const int iCsr
26b50 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
26b60 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  +;     /* Cursor
26b70 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20   to scan b-tree 
26b80 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
26b90 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bb0 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
26bc0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
26bd0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
26be0 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
26bf0 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20       /* Keyinfo 
26c00 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65  for scanned inde
26c10 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  x */.        Ind
26c20 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20  ex *pBest = 0;  
26c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c40 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20    /* Best index 
26c50 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a  found so far */.
26c60 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f          int iRoo
26c70 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20  t = pTab->tnum; 
26c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26c90 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61  Root page of sca
26ca0 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  nned b-tree */..
26cb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
26cc0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
26cd0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
26ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
26cf0 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
26d00 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
26d10 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
26d20 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61  ..        /* Sea
26d30 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65  rch for the inde
26d40 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c  x that has the l
26d50 65 61 73 74 20 61 6d 6f 75 6e 74 20 6f 66 20 63  east amount of c
26d60 6f 6c 75 6d 6e 73 2e 20 49 66 0a 20 20 20 20 20  olumns. If.     
26d70 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 73     ** there is s
26d80 75 63 68 20 61 6e 20 69 6e 64 65 78 2c 20 61 6e  uch an index, an
26d90 64 20 69 74 20 68 61 73 20 6c 65 73 73 20 63 6f  d it has less co
26da0 6c 75 6d 6e 73 20 74 68 61 6e 20 74 68 65 20 74  lumns than the t
26db0 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  able.        ** 
26dc0 64 6f 65 73 2c 20 74 68 65 6e 20 77 65 20 63 61  does, then we ca
26dd0 6e 20 61 73 73 75 6d 65 20 74 68 61 74 20 69 74  n assume that it
26de0 20 63 6f 6e 73 75 6d 65 73 20 6c 65 73 73 20 73   consumes less s
26df0 70 61 63 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64  pace on disk and
26e00 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  .        ** will
26e10 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 63 68   therefore be ch
26e20 65 61 70 65 72 20 74 6f 20 73 63 61 6e 20 74 6f  eaper to scan to
26e30 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 71   determine the q
26e40 75 65 72 79 20 72 65 73 75 6c 74 2e 0a 20 20 20  uery result..   
26e50 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
26e60 63 61 73 65 20 73 65 74 20 69 52 6f 6f 74 20 74  case set iRoot t
26e70 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
26e80 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
26e90 64 65 78 20 62 2d 74 72 65 65 0a 20 20 20 20 20  dex b-tree.     
26ea0 20 20 20 2a 2a 20 61 6e 64 20 70 4b 65 79 49 6e     ** and pKeyIn
26eb0 66 6f 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66  fo to the KeyInf
26ec0 6f 20 73 74 72 75 63 74 75 72 65 20 72 65 71 75  o structure requ
26ed0 69 72 65 64 20 74 6f 20 6e 61 76 69 67 61 74 65  ired to navigate
26ee0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
26ef0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
26f00 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
26f10 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74  11-04-15) Do not
26f20 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20   do a full scan 
26f30 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20  of an unordered 
26f40 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
26f50 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
26f60 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79  practice the Key
26f70 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77  Info structure w
26f80 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
26f90 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20   It is only .   
26fa0 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74       ** passed t
26fb0 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65  o keep OP_OpenRe
26fc0 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20  ad happy..      
26fd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72    */.        for
26fe0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
26ff0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
27000 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
27010 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
27020 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 20 26  >bUnordered==0 &
27030 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64  & (!pBest || pId
27040 78 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 42 65 73 74  x->nColumn<pBest
27050 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 7b 0a 20 20  ->nColumn) ){.  
27060 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20            pBest 
27070 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
27080 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
27090 20 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20        if( pBest 
270a0 26 26 20 70 42 65 73 74 2d 3e 6e 43 6f 6c 75 6d  && pBest->nColum
270b0 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  n<pTab->nCol ){.
270c0 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20            iRoot 
270d0 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20  = pBest->tnum;. 
270e0 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
270f0 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  o = sqlite3Index
27100 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
27110 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pBest);.        
27120 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  }..        /* Op
27130 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  en a read-only c
27140 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74  ursor, execute t
27150 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f  he OP_Count, clo
27160 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a  se the cursor. *
27170 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
27180 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
27190 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72  P_OpenRead, iCsr
271a0 2c 20 69 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20  , iRoot, iDb);. 
271b0 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
271c0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
271d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
271e0 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
271f0 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  r *)pKeyInfo, P4
27200 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
27210 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
27220 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27230 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75  AddOp2(v, OP_Cou
27240 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e  nt, iCsr, sAggIn
27250 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d  fo.aFunc[0].iMem
27260 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
27270 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
27280 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b  OP_Close, iCsr);
27290 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
272a0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72  SimpleCount(pPar
272b0 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29  se, pTab, pBest)
272c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
272d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
272e0 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a  MIT_BTREECOUNT *
272f0 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
27300 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
27310 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e  e query is of on
27320 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
27330 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20  ng forms:.      
27340 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
27350 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20    SELECT min(x) 
27360 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20  FROM ....       
27370 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78   **   SELECT max
27380 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
27390 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
273a0 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
273b0 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69  n ask the code i
273c0 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74  n where.c to att
273d0 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73  empt to sort res
273e0 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ults.        ** 
273f0 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  as if there was 
27400 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20  an "ORDER ON x" 
27410 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44  or "ORDER ON x D
27420 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20  ESC" clause. .  
27430 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72        ** If wher
27440 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70  e.c is able to p
27450 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73  roduce results s
27460 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72  orted in this or
27470 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  der, then.      
27480 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f    ** add vdbe co
27490 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  de to break out 
274a0 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  of the processin
274b0 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65  g loop after the
274c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72   .        ** fir
274d0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69  st iteration (si
274e0 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74  nce the first it
274f0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
27500 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20  oop is .        
27510 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
27520 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
27530 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e  row with the min
27540 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20  imum or maximum 
27550 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  .        ** valu
27560 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79  e of x, the only
27570 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a   row required)..
27580 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
27590 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20     ** A special 
275a0 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73  flag must be pas
275b0 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
275c0 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c  ereBegin() to sl
275d0 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a  ightly.        *
275e0 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f  * modify behavio
275f0 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ur as follows:. 
27600 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
27610 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20    **   + If the 
27620 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45  query is a "SELE
27630 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e  CT min(x)", then
27640 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20   the loop coded 
27650 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  by.        **   
27660 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64    where.c should
27670 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65   not iterate ove
27680 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74  r any values wit
27690 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20  h a NULL value. 
276a0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f         **     fo
276b0 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  r x..        **.
276c0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54          **   + T
276d0 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64  he optimizer cod
276e0 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68  e in where.c (th
276f0 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63  e thing that dec
27700 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20  ides which.     
27710 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20     **     index 
27720 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73  or indices to us
27730 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20  e) should place 
27740 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f  a different prio
27750 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20  rity on .       
27760 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79 69   **     satisfyi
27770 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42 59  ng the 'ORDER BY
27780 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74  ' clause than it
27790 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63   does in other c
277a0 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ases..        **
277b0 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f       Refer to co
277c0 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20  de and comments 
277d0 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64  in where.c for d
277e0 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20  etails..        
277f0 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  */.        ExprL
27800 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30  ist *pMinMax = 0
27810 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c 61  ;.        u8 fla
27820 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28  g = minMaxQuery(
27830 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
27840 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  flag ){.        
27850 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
27860 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 45  asProperty(p->pE
27870 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
27880 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
27890 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69  );.          pMi
278a0 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78  nMax = sqlite3Ex
278b0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
278c0 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
278d0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 30 29 3b  xpr->x.pList,0);
278e0 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c 20  .          pDel 
278f0 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20  = pMinMax;.     
27900 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78       if( pMinMax
27910 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
27920 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
27930 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
27940 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66  0].sortOrder = f
27950 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag!=WHERE_ORDER
27960 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20  BY_MIN ?1:0;.   
27970 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
27980 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
27990 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
279a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
279b0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f    }.  .        /
279c0 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73  * This case runs
279d0 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74   if the aggregat
279e0 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  e has no GROUP B
279f0 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20  Y clause.  The. 
27a00 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
27a10 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d  sing is much sim
27a20 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65  pler since there
27a30 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   is only a singl
27a40 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  e row.        **
27a50 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20   of output..    
27a60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
27a70 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
27a80 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
27a90 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  o);.        pWIn
27aa0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
27ab0 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
27ac0 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
27ad0 20 26 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67   &pMinMax,0,flag
27ae0 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,0);.        if(
27af0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20   pWInfo==0 ){.  
27b00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
27b10 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
27b20 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20  , pDel);.       
27b30 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
27b40 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
27b50 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
27b60 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
27b70 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
27b80 20 20 20 20 69 66 28 20 21 70 4d 69 6e 4d 61 78      if( !pMinMax
27b90 20 26 26 20 66 6c 61 67 20 29 7b 0a 20 20 20 20   && flag ){.    
27ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27bb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
27bc0 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69  to, 0, pWInfo->i
27bd0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
27be0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
27bf0 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78  , "%s() by index
27c00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
27c10 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f     (flag==WHERE_
27c20 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e  ORDERBY_MIN?"min
27c30 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20  ":"max")));.    
27c40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
27c50 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
27c60 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66  Info);.        f
27c70 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
27c80 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
27c90 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  gInfo);.      }.
27ca0 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
27cb0 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
27cc0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
27cd0 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
27ce0 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a  ddrEnd, SQLITE_J
27cf0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
27d00 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
27d10 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
27d20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  pEList, 0, 0, 0,
27d30 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20   -1, .          
27d40 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
27d50 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72  t, addrEnd, addr
27d60 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  End);.      sqli
27d70 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
27d80 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
27d90 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
27da0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
27db0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
27dc0 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67  .  } /* endif ag
27dd0 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
27de0 0a 0a 20 20 69 66 28 20 64 69 73 74 69 6e 63 74  ..  if( distinct
27df0 3e 3d 30 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  >=0 ){.    expla
27e00 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
27e10 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b  se, "DISTINCT");
27e20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
27e30 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
27e40 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
27e50 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
27e60 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
27e70 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
27e80 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
27e90 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
27ea0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
27eb0 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
27ec0 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
27ed0 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20  ORDER BY");.    
27ee0 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
27ef0 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70  (pParse, p, v, p
27f00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44  EList->nExpr, pD
27f10 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  est);.  }..  /* 
27f20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
27f30 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  p this query.  *
27f40 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
27f50 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
27f60 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  End);..  /* The 
27f70 53 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65  SELECT was succe
27f80 73 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20  ssfully coded.  
27f90 20 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   Set the return 
27fa0 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74  code to 0.  ** t
27fb0 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72  o indicate no er
27fc0 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  rors..  */.  rc 
27fd0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  = 0;..  /* Contr
27fe0 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
27ff0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
28000 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
28010 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
28020 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
28030 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
28040 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
28050 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  :.  explainSetIn
28060 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53  teger(pParse->iS
28070 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72  electId, iRestor
28080 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f  eSelectId);..  /
28090 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
280a0 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c  n names if resul
280b0 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
280c0 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75   are to be outpu
280d0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  t..  */.  if( rc
280e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
280f0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
28100 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67  _Output ){.    g
28110 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
28120 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
28130 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
28140 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  }..  sqlite3DbFr
28150 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
28160 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
28170 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
28180 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65  nfo.aFunc);.  re
28190 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
281a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
281b0 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
281c0 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  IN)./*.** Genera
281d0 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  te a human-reada
281e0 62 6c 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ble description 
281f0 6f 66 20 61 20 74 68 65 20 53 65 6c 65 63 74 20  of a the Select 
28200 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
28210 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e  c void explainOn
28220 65 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56  eSelect(Vdbe *pV
28230 64 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  dbe, Select *p){
28240 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
28250 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
28260 53 45 4c 45 43 54 20 22 29 3b 0a 20 20 69 66 28  SELECT ");.  if(
28270 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28   p->selFlags & (
28280 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
28290 67 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20  ggregate) ){.   
282a0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
282b0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
282c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
282d0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
282e0 62 65 2c 20 22 44 49 53 54 49 4e 43 54 20 22 29  be, "DISTINCT ")
282f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28300 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
28310 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20  _Aggregate ){.  
28320 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28330 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
28340 22 61 67 67 5f 66 6c 61 67 20 22 29 3b 0a 20 20  "agg_flag ");.  
28350 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
28360 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
28370 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
28380 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
28390 20 22 20 20 20 22 29 3b 0a 20 20 7d 0a 20 20 73   "   ");.  }.  s
283a0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
283b0 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e  rList(pVdbe, p->
283c0 70 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  pEList);.  sqlit
283d0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
283e0 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72  e);.  if( p->pSr
283f0 63 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53  c && p->pSrc->nS
28400 72 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  rc ){.    int i;
28410 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
28420 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
28430 20 22 46 52 4f 4d 20 22 29 3b 0a 20 20 20 20 73   "FROM ");.    s
28440 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73  qlite3ExplainPus
28450 68 28 70 56 64 62 65 29 3b 0a 20 20 20 20 66 6f  h(pVdbe);.    fo
28460 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63  r(i=0; i<p->pSrc
28470 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
28480 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
28490 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
284a0 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b   &p->pSrc->a[i];
284b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
284c0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
284d0 65 2c 20 22 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20  e, "{%d,*} = ", 
284e0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
284f0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
28500 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
28510 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
28520 61 69 6e 53 65 6c 65 63 74 28 70 56 64 62 65 2c  ainSelect(pVdbe,
28530 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29   pItem->pSelect)
28540 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
28550 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20  tem->pTab ){.   
28560 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
28570 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
28580 65 2c 20 22 20 28 74 61 62 6e 61 6d 65 3d 25 73  e, " (tabname=%s
28590 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  )", pItem->pTab-
285a0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
285b0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
285c0 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  f( pItem->zName 
285d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
285e0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
285f0 70 56 64 62 65 2c 20 22 25 73 22 2c 20 70 49 74  pVdbe, "%s", pIt
28600 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
28610 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
28620 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
28630 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
28640 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
28650 65 2c 20 22 20 28 41 53 20 25 73 29 22 2c 20 70  e, " (AS %s)", p
28660 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
28670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
28680 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65   pItem->jointype
28690 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20   & JT_LEFT ){.  
286a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
286b0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
286c0 2c 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b  , " LEFT-JOIN");
286d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
286e0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
286f0 70 56 64 62 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pVdbe);.    }.  
28700 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
28710 50 6f 70 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  Pop(pVdbe);.  }.
28720 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
28730 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
28740 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
28750 65 2c 20 22 57 48 45 52 45 20 22 29 3b 0a 20 20  e, "WHERE ");.  
28760 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
28770 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70  Expr(pVdbe, p->p
28780 57 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69  Where);.    sqli
28790 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
287a0 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
287b0 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
287c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
287d0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 47  Printf(pVdbe, "G
287e0 52 4f 55 50 42 59 20 22 29 3b 0a 20 20 20 20 73  ROUPBY ");.    s
287f0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
28800 72 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e  rList(pVdbe, p->
28810 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
28820 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
28830 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pVdbe);.  }.  if
28840 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  ( p->pHaving ){.
28850 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
28860 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
28870 22 48 41 56 49 4e 47 20 22 29 3b 0a 20 20 20 20  "HAVING ");.    
28880 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
28890 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 48 61  pr(pVdbe, p->pHa
288a0 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  ving);.    sqlit
288b0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
288c0 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
288d0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
288e0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
288f0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 52  rintf(pVdbe, "OR
28900 44 45 52 42 59 20 22 29 3b 0a 20 20 20 20 73 71  DERBY ");.    sq
28910 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
28920 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70  List(pVdbe, p->p
28930 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71  OrderBy);.    sq
28940 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
28950 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
28960 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
28970 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
28980 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4c  Printf(pVdbe, "L
28990 49 4d 49 54 20 22 29 3b 0a 20 20 20 20 73 71 6c  IMIT ");.    sql
289a0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
289b0 70 56 64 62 65 2c 20 70 2d 3e 70 4c 69 6d 69 74  pVdbe, p->pLimit
289c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
289d0 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
289e0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66    }.  if( p->pOf
289f0 66 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  fset ){.    sqli
28a00 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
28a10 28 70 56 64 62 65 2c 20 22 4f 46 46 53 45 54 20  (pVdbe, "OFFSET 
28a20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
28a30 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65  xplainExpr(pVdbe
28a40 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20  , p->pOffset);. 
28a50 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
28a60 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
28a70 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  }.void sqlite3Ex
28a80 70 6c 61 69 6e 53 65 6c 65 63 74 28 56 64 62 65  plainSelect(Vdbe
28a90 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20   *pVdbe, Select 
28aa0 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  *p){.  if( p==0 
28ab0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
28ac0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
28ad0 65 2c 20 22 28 6e 75 6c 6c 2d 73 65 6c 65 63 74  e, "(null-select
28ae0 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  )");.    return;
28af0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d  .  }.  while( p-
28b00 3e 70 50 72 69 6f 72 20 29 20 70 20 3d 20 70 2d  >pPrior ) p = p-
28b10 3e 70 50 72 69 6f 72 3b 0a 20 20 73 71 6c 69 74  >pPrior;.  sqlit
28b20 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56  e3ExplainPush(pV
28b30 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  dbe);.  while( p
28b40 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f   ){.    explainO
28b50 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20  neSelect(pVdbe, 
28b60 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  p);.    p = p->p
28b70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 3d  Next;.    if( p=
28b80 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
28b90 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
28ba0 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c  (pVdbe);.    sql
28bb0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
28bc0 66 28 70 56 64 62 65 2c 20 22 25 73 5c 6e 22 2c  f(pVdbe, "%s\n",
28bd0 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
28be0 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >op));.  }.  sql
28bf0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
28c00 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29 3b  f(pVdbe, "END");
28c10 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
28c20 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a 0a  nPop(pVdbe);.}..
28c30 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74  /* End of the st
28c40 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72  ructure debug pr
28c50 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a  inting code.****
28c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69  *********/.#endi
28cb0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
28cc0 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
28cd0 45 58 50 4c 41 49 4e 29 20 2a 2f 0a              EXPLAIN) */.