/ Hex Artifact Content
Login

Artifact e5b3b244e349cc42401fb62a6c14ea09ea46403c:


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 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 34 39 31  select.c,v 1.491
0200: 20 32 30 30 38 2f 31 32 2f 31 30 20 31 37 3a 32   2008/12/10 17:2
0210: 30 3a 30 31 20 64 72 68 20 45 78 70 20 24 0a 2a  0:01 drh Exp $.*
0220: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0230: 74 65 49 6e 74 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a  teInt.h".../*.**
0240: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0250: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0260: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 62 75  ect structure bu
0270: 74 20 64 6f 20 6e 6f 74 20 64 65 61 6c 6c 6f 63  t do not dealloc
0280: 61 74 65 0a 2a 2a 20 74 68 65 20 73 65 6c 65 63  ate.** the selec
0290: 74 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  t structure itse
02a0: 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  lf..*/.static vo
02b0: 69 64 20 63 6c 65 61 72 53 65 6c 65 63 74 28 73  id clearSelect(s
02c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
02d0: 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  ct *p){.  sqlite
02e0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
02f0: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
0300: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
0310: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
0320: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  rc);.  sqlite3Ex
0330: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
0340: 70 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  pWhere);.  sqlit
0350: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0360: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
0370: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
0380: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0390: 61 76 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  aving);.  sqlite
03a0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
03b0: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
03c0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
03d0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
03e0: 50 72 69 6f 72 29 3b 0a 20 20 73 71 6c 69 74 65  Prior);.  sqlite
03f0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
0400: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71  p->pLimit);.  sq
0410: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0420: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
0440: 6c 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73  lize a SelectDes
0450: 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  t structure..*/.
0460: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
0470: 63 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63  ctDestInit(Selec
0480: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e  tDest *pDest, in
0490: 74 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61  t eDest, int iPa
04a0: 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44  rm){.  pDest->eD
04b0: 65 73 74 20 3d 20 65 44 65 73 74 3b 0a 20 20 70  est = eDest;.  p
04c0: 44 65 73 74 2d 3e 69 50 61 72 6d 20 3d 20 69 50  Dest->iParm = iP
04d0: 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66  arm;.  pDest->af
04e0: 66 69 6e 69 74 79 20 3d 20 30 3b 0a 20 20 70 44  finity = 0;.  pD
04f0: 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 30 3b 0a 20  est->iMem = 0;. 
0500: 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 30   pDest->nMem = 0
0510: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0520: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0530: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0540: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0550: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0560: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0570: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0580: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0590: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
05a0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
05b0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
05c0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
05d0: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
05e0: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
05f0: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
0600: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0610: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0620: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0630: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0640: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0650: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0660: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0670: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0680: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0690: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
06a0: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
06b0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
06c0: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
06d0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
06e0: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
06f0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
0700: 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
0710: 2c 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20  ,       /* true 
0720: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
0730: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
0740: 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  nt */.  Expr *pL
0750: 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  imit,         /*
0760: 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e   LIMIT value.  N
0770: 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73  ULL means not us
0780: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  ed */.  Expr *pO
0790: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 2f 2a  ffset         /*
07a0: 20 4f 46 46 53 45 54 20 76 61 6c 75 65 2e 20 20   OFFSET value.  
07b0: 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66  NULL means no of
07c0: 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  fset */.){.  Sel
07d0: 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
07e0: 65 63 74 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73  ect standin;.  s
07f0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
0800: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20  rse->db;.  pNew 
0810: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0820: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
0830: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 61 73 73  (*pNew) );.  ass
0840: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
0850: 61 69 6c 65 64 20 7c 7c 20 21 70 4f 66 66 73 65  ailed || !pOffse
0860: 74 20 7c 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f  t || pLimit ); /
0870: 2a 20 4f 46 46 53 45 54 20 69 6d 70 6c 69 65 73  * OFFSET implies
0880: 20 4c 49 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20   LIMIT */.  if( 
0890: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pNew==0 ){.    p
08a0: 4e 65 77 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a  New = &standin;.
08b0: 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c      memset(pNew,
08c0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77   0, sizeof(*pNew
08d0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  ));.  }.  if( pE
08e0: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
08f0: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
0900: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
0910: 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33  arse, 0, sqlite3
0920: 45 78 70 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30  Expr(db,TK_ALL,0
0930: 2c 30 2c 30 29 2c 20 30 29 3b 0a 20 20 7d 0a 20  ,0,0), 0);.  }. 
0940: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
0950: 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e  pEList;.  pNew->
0960: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70  pSrc = pSrc;.  p
0970: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  New->pWhere = pW
0980: 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  here;.  pNew->pG
0990: 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
09a0: 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  y;.  pNew->pHavi
09b0: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
09c0: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
09d0: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65   pOrderBy;.  pNe
09e0: 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 69 73  w->selFlags = is
09f0: 44 69 73 74 69 6e 63 74 20 3f 20 53 46 5f 44 69  Distinct ? SF_Di
0a00: 73 74 69 6e 63 74 20 3a 20 30 3b 0a 20 20 70 4e  stinct : 0;.  pN
0a10: 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45  ew->op = TK_SELE
0a20: 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d  CT;.  pNew->pLim
0a30: 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70  it = pLimit;.  p
0a40: 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  New->pOffset = p
0a50: 4f 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e  Offset;.  pNew->
0a60: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
0a70: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
0a80: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
0a90: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
0aa0: 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31  OpenEphm[2] = -1
0ab0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
0ac0: 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20 20 20  ocFailed ) {.   
0ad0: 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c   clearSelect(db,
0ae0: 20 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20   pNew);.    if( 
0af0: 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29  pNew!=&standin )
0b00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
0b10: 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 70 4e  b, pNew);.    pN
0b20: 65 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ew = 0;.  }.  re
0b30: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
0b40: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67  .** Delete the g
0b50: 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75  iven Select stru
0b60: 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66  cture and all of
0b70: 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72   its substructur
0b80: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
0b90: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
0ba0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c  sqlite3 *db, Sel
0bb0: 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
0bc0: 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c   ){.    clearSel
0bd0: 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  ect(db, p);.    
0be0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
0bf0: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
0c00: 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20  ** Given 1 to 3 
0c10: 69 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63  identifiers prec
0c20: 65 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20  eeding the JOIN 
0c30: 6b 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69  keyword, determi
0c40: 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f  ne the.** type o
0c50: 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20  f join.  Return 
0c60: 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74  an integer const
0c70: 61 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73  ant that express
0c80: 65 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20  es that type.** 
0c90: 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  in terms of the 
0ca0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61  following bit va
0cb0: 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lues:.**.**     
0cc0: 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20  JT_INNER.**     
0cd0: 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20  JT_CROSS.**     
0ce0: 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20  JT_OUTER.**     
0cf0: 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20  JT_NATURAL.**   
0d00: 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20    JT_LEFT.**    
0d10: 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20   JT_RIGHT.**.** 
0d20: 41 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69  A full outer joi
0d30: 6e 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61  n is the combina
0d40: 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20  tion of JT_LEFT 
0d50: 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a  and JT_RIGHT..**
0d60: 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61  .** If an illega
0d70: 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64  l or unsupported
0d80: 20 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65   join type is se
0d90: 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72  en, then still r
0da0: 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20  eturn.** a join 
0db0: 74 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e  type, but put an
0dc0: 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50   error in the pP
0dd0: 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
0de0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f  */.int sqlite3Jo
0df0: 69 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  inType(Parse *pP
0e00: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c  arse, Token *pA,
0e10: 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65   Token *pB, Toke
0e20: 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f  n *pC){.  int jo
0e30: 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f  intype = 0;.  To
0e40: 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20  ken *apAll[3];. 
0e50: 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74 61   Token *p;.  sta
0e60: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
0e70: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
0e80: 72 20 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b 0a 20  r zKeyword[8];. 
0e90: 20 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20     u8 nChar;.   
0ea0: 20 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65   u8 code;.  } ke
0eb0: 79 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20  ywords[] = {.   
0ec0: 20 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c   { "natural", 7,
0ed0: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20   JT_NATURAL },. 
0ee0: 20 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20     { "left",    
0ef0: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55  4, JT_LEFT|JT_OU
0f00: 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69  TER },.    { "ri
0f10: 67 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49  ght",   5, JT_RI
0f20: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0f30: 20 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20      { "full",   
0f40: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52   4, JT_LEFT|JT_R
0f50: 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  IGHT|JT_OUTER },
0f60: 0a 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20  .    { "outer", 
0f70: 20 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c    5, JT_OUTER },
0f80: 0a 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20  .    { "inner", 
0f90: 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c    5, JT_INNER },
0fa0: 0a 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20  .    { "cross", 
0fb0: 20 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54    5, JT_INNER|JT
0fc0: 5f 43 52 4f 53 53 20 7d 2c 0a 20 20 7d 3b 0a 20  _CROSS },.  };. 
0fd0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41   int i, j;.  apA
0fe0: 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70  ll[0] = pA;.  ap
0ff0: 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61  All[1] = pB;.  a
1000: 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20  pAll[2] = pC;.  
1010: 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20  for(i=0; i<3 && 
1020: 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  apAll[i]; i++){.
1030: 20 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d      p = apAll[i]
1040: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1050: 3c 41 72 72 61 79 53 69 7a 65 28 6b 65 79 77 6f  <ArraySize(keywo
1060: 72 64 73 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  rds); j++){.    
1070: 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77    if( p->n==keyw
1080: 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20  ords[j].nChar . 
1090: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
10a0: 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61  te3StrNICmp((cha
10b0: 72 2a 29 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64  r*)p->z, keyword
10c0: 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70  s[j].zKeyword, p
10d0: 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->n)==0 ){.     
10e0: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b     jointype |= k
10f0: 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b  eywords[j].code;
1100: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1110: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1120: 20 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69    if( j>=ArraySi
1130: 7a 65 28 6b 65 79 77 6f 72 64 73 29 20 29 7b 0a  ze(keywords) ){.
1140: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
1150: 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20  = JT_ERROR;.    
1160: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1170: 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a   }.  if(.     (j
1180: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e  ointype & (JT_IN
1190: 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d  NER|JT_OUTER))==
11a0: 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54  (JT_INNER|JT_OUT
11b0: 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69  ER) ||.     (joi
11c0: 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52  ntype & JT_ERROR
11d0: 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f  )!=0.  ){.    co
11e0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20  nst char *zSp = 
11f0: 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28  " ";.    assert(
1200: 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   pB!=0 );.    if
1210: 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b  ( pC==0 ){ zSp++
1220: 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ; }.    sqlite3E
1230: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1240: 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75  "unknown or unsu
1250: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
1260: 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 20  e: ".       "%T 
1270: 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c  %T%s%T", pA, pB,
1280: 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a   zSp, pC);.    j
1290: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
12a0: 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ER;.  }else if( 
12b0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 52 49  jointype & JT_RI
12c0: 47 48 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  GHT ){.    sqlit
12d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12e0: 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54  e, .      "RIGHT
12f0: 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20   and FULL OUTER 
1300: 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75  JOINs are not cu
1310: 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65  rrently supporte
1320: 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  d");.    jointyp
1330: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
1340: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74  }.  return joint
1350: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ype;.}../*.** Re
1360: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1370: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  f a column in a 
1380: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d  table.  Return -
1390: 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  1 if the column.
13a0: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
13b0: 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ned in the table
13c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13d0: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c  columnIndex(Tabl
13e0: 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63  e *pTab, const c
13f0: 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e  har *zCol){.  in
1400: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1410: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
1420: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
1430: 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d  te3StrICmp(pTab-
1440: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
1450: 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72  zCol)==0 ) retur
1460: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1470: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n -1;.}../*.** S
1480: 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
1490: 61 20 74 6f 6b 65 6e 20 74 6f 20 61 20 27 5c 30  a token to a '\0
14a0: 30 30 27 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  00'-terminated s
14b0: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
14c0: 20 76 6f 69 64 20 73 65 74 54 6f 6b 65 6e 28 54   void setToken(T
14d0: 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63  oken *p, const c
14e0: 68 61 72 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20  har *z){.  p->z 
14f0: 3d 20 28 75 38 2a 29 7a 3b 0a 20 20 70 2d 3e 6e  = (u8*)z;.  p->n
1500: 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a 29   = z ? strlen(z)
1510: 20 3a 20 30 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d   : 0;.  p->dyn =
1520: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
1530: 20 74 68 65 20 74 6f 6b 65 6e 20 74 6f 20 74 68   the token to th
1540: 65 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  e double-quoted 
1550: 61 6e 64 20 65 73 63 61 70 65 64 20 76 65 72 73  and escaped vers
1560: 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 72 69 6e  ion of the strin
1570: 67 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  g pointed.** to 
1580: 62 79 20 7a 2e 20 46 6f 72 20 65 78 61 6d 70 6c  by z. For exampl
1590: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 7b 61 22 62  e;.**.**    {a"b
15a0: 63 7d 20 20 2d 3e 20 20 7b 22 61 22 22 62 63 22  c}  ->  {"a""bc"
15b0: 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  }.*/.static void
15c0: 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28   setQuotedToken(
15d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
15e0: 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73 74 20 63  oken *p, const c
15f0: 68 61 72 20 2a 7a 29 7b 0a 0a 20 20 2f 2a 20 43  har *z){..  /* C
1600: 68 65 63 6b 20 69 66 20 74 68 65 20 73 74 72 69  heck if the stri
1610: 6e 67 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ng appears to be
1620: 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 22 2e   quoted using ".
1630: 2e 2e 22 20 6f 72 20 60 2e 2e 2e 60 0a 20 20 2a  .." or `...`.  *
1640: 2a 20 6f 72 20 5b 2e 2e 2e 5d 20 6f 72 20 27 2e  * or [...] or '.
1650: 2e 2e 27 20 6f 72 20 69 66 20 74 68 65 20 73 74  ..' or if the st
1660: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ring contains an
1670: 79 20 22 20 63 68 61 72 61 63 74 65 72 73 2e 20  y " characters. 
1680: 20 0a 20 20 2a 2a 20 49 66 20 69 74 20 64 6f 65   .  ** If it doe
1690: 73 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61  s, then record a
16a0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
16b0: 73 74 72 69 6e 67 20 77 69 74 68 20 74 68 65 20  string with the 
16c0: 73 70 65 63 69 61 6c 0a 20 20 2a 2a 20 63 68 61  special.  ** cha
16d0: 72 61 63 74 65 72 73 20 65 73 63 61 70 65 64 2e  racters escaped.
16e0: 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  .  */.  const ch
16f0: 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 69 66  ar *z2 = z;.  if
1700: 28 20 2a 7a 32 21 3d 27 5b 27 20 26 26 20 2a 7a  ( *z2!='[' && *z
1710: 32 21 3d 27 60 27 20 26 26 20 2a 7a 32 21 3d 27  2!='`' && *z2!='
1720: 5c 27 27 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  \'' ){.    while
1730: 28 20 2a 7a 32 20 29 7b 0a 20 20 20 20 20 20 69  ( *z2 ){.      i
1740: 66 28 20 2a 7a 32 3d 3d 27 22 27 20 29 20 62 72  f( *z2=='"' ) br
1750: 65 61 6b 3b 0a 20 20 20 20 20 20 7a 32 2b 2b 3b  eak;.      z2++;
1760: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1770: 28 20 2a 7a 32 20 29 7b 0a 20 20 20 20 2f 2a 20  ( *z2 ){.    /* 
1780: 53 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20  String contains 
1790: 22 20 63 68 61 72 61 63 74 65 72 73 20 2d 20 63  " characters - c
17a0: 6f 70 79 20 61 6e 64 20 71 75 6f 74 65 20 74 68  opy and quote th
17b0: 65 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 20 20 20  e string. */.   
17c0: 20 70 2d 3e 7a 20 3d 20 28 75 38 20 2a 29 73 71   p->z = (u8 *)sq
17d0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
17e0: 72 73 65 2d 3e 64 62 2c 20 22 5c 22 25 77 5c 22  rse->db, "\"%w\"
17f0: 22 2c 20 7a 29 3b 0a 20 20 20 20 69 66 28 20 70  ", z);.    if( p
1800: 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ->z ){.      p->
1810: 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68 61 72  n = strlen((char
1820: 20 2a 29 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20   *)p->z);.      
1830: 70 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20  p->dyn = 1;.    
1840: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
1850: 2a 20 53 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  * String contain
1860: 73 20 6e 6f 20 22 20 63 68 61 72 61 63 74 65 72  s no " character
1870: 73 20 2d 20 63 6f 70 79 20 74 68 65 20 70 6f 69  s - copy the poi
1880: 6e 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e  nter. */.    p->
1890: 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a 20 20 20 20  z = (u8*)z;.    
18a0: 70 2d 3e 6e 20 3d 20 28 7a 32 20 2d 20 7a 29 3b  p->n = (z2 - z);
18b0: 0a 20 20 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b  .    p->dyn = 0;
18c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  .  }.}../*.** Cr
18d0: 65 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  eate an expressi
18e0: 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 6e 20 69  on node for an i
18f0: 64 65 6e 74 69 66 69 65 72 20 77 69 74 68 20 74  dentifier with t
1900: 68 65 20 6e 61 6d 65 20 6f 66 20 7a 4e 61 6d 65  he name of zName
1910: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
1920: 33 43 72 65 61 74 65 49 64 45 78 70 72 28 50 61  3CreateIdExpr(Pa
1930: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1940: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
1950: 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
1960: 20 20 73 65 74 54 6f 6b 65 6e 28 26 64 75 6d 6d    setToken(&dumm
1970: 79 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  y, zName);.  ret
1980: 75 72 6e 20 73 71 6c 69 74 65 33 50 45 78 70 72  urn sqlite3PExpr
1990: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20  (pParse, TK_ID, 
19a0: 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d  0, 0, &dummy);.}
19b0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65  ../*.** Add a te
19c0: 72 6d 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  rm to the WHERE 
19d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 2a 70  expression in *p
19e0: 70 45 78 70 72 20 74 68 61 74 20 72 65 71 75 69  pExpr that requi
19f0: 72 65 73 20 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20  res the.** zCol 
1a00: 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 65 71 75  column to be equ
1a10: 61 6c 20 69 6e 20 74 68 65 20 74 77 6f 20 74 61  al in the two ta
1a20: 62 6c 65 73 20 70 54 61 62 31 20 61 6e 64 20 70  bles pTab1 and p
1a30: 54 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Tab2..*/.static 
1a40: 76 6f 69 64 20 61 64 64 57 68 65 72 65 54 65 72  void addWhereTer
1a50: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  m(.  Parse *pPar
1a60: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  se,           /*
1a70: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1a80: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1a90: 20 2a 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 2f   *zCol,        /
1aa0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
1ab0: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lumn */.  const 
1ac0: 54 61 62 6c 65 20 2a 70 54 61 62 31 2c 20 20 20  Table *pTab1,   
1ad0: 20 20 20 2f 2a 20 46 69 72 73 74 20 74 61 62 6c     /* First tabl
1ae0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1af0: 72 20 2a 7a 41 6c 69 61 73 31 2c 20 20 20 20 20  r *zAlias1,     
1b00: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 66 69 72  /* Alias for fir
1b10: 73 74 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62  st table.  May b
1b20: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  e NULL */.  cons
1b30: 74 20 54 61 62 6c 65 20 2a 70 54 61 62 32 2c 20  t Table *pTab2, 
1b40: 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 74       /* Second t
1b50: 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  able */.  const 
1b60: 63 68 61 72 20 2a 7a 41 6c 69 61 73 32 2c 20 20  char *zAlias2,  
1b70: 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20     /* Alias for 
1b80: 73 65 63 6f 6e 64 20 74 61 62 6c 65 2e 20 20 4d  second table.  M
1b90: 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1ba0: 69 6e 74 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  int iRightJoinTa
1bb0: 62 6c 65 2c 20 20 20 20 20 2f 2a 20 56 44 42 45  ble,     /* VDBE
1bc0: 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1bd0: 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20  right table */. 
1be0: 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72 2c 20   Expr **ppExpr, 
1bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1c00: 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65   the equality te
1c10: 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70 72 65  rm to this expre
1c20: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ssion */.  int i
1c30: 73 4f 75 74 65 72 4a 6f 69 6e 20 20 20 20 20 20  sOuterJoin      
1c40: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64      /* True if d
1c50: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 4f  ealing with an O
1c60: 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a  UTER join */.){.
1c70: 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20 2a 70    Expr *pE1a, *p
1c80: 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20 45 78  E1b, *pE1c;.  Ex
1c90: 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32 62 2c  pr *pE2a, *pE2b,
1ca0: 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72 20 2a   *pE2c;.  Expr *
1cb0: 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d 20 73 71  pE;..  pE1a = sq
1cc0: 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70  lite3CreateIdExp
1cd0: 72 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 29 3b  r(pParse, zCol);
1ce0: 0a 20 20 70 45 32 61 20 3d 20 73 71 6c 69 74 65  .  pE2a = sqlite
1cf0: 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50  3CreateIdExpr(pP
1d00: 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 69  arse, zCol);.  i
1d10: 66 28 20 7a 41 6c 69 61 73 31 3d 3d 30 20 29 7b  f( zAlias1==0 ){
1d20: 0a 20 20 20 20 7a 41 6c 69 61 73 31 20 3d 20 70  .    zAlias1 = p
1d30: 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d  Tab1->zName;.  }
1d40: 0a 20 20 70 45 31 62 20 3d 20 73 71 6c 69 74 65  .  pE1b = sqlite
1d50: 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50  3CreateIdExpr(pP
1d60: 61 72 73 65 2c 20 7a 41 6c 69 61 73 31 29 3b 0a  arse, zAlias1);.
1d70: 20 20 69 66 28 20 7a 41 6c 69 61 73 32 3d 3d 30    if( zAlias2==0
1d80: 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 32 20   ){.    zAlias2 
1d90: 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a  = pTab2->zName;.
1da0: 20 20 7d 0a 20 20 70 45 32 62 20 3d 20 73 71 6c    }.  pE2b = sql
1db0: 69 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72  ite3CreateIdExpr
1dc0: 28 70 50 61 72 73 65 2c 20 7a 41 6c 69 61 73 32  (pParse, zAlias2
1dd0: 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71 6c 69  );.  pE1c = sqli
1de0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
1df0: 20 54 4b 5f 44 4f 54 2c 20 70 45 31 62 2c 20 70   TK_DOT, pE1b, p
1e00: 45 31 61 2c 20 30 29 3b 0a 20 20 70 45 32 63 20  E1a, 0);.  pE2c 
1e10: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1e20: 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
1e30: 45 32 62 2c 20 70 45 32 61 2c 20 30 29 3b 0a 20  E2b, pE2a, 0);. 
1e40: 20 70 45 20 3d 20 73 71 6c 69 74 65 33 50 45 78   pE = sqlite3PEx
1e50: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 51  pr(pParse, TK_EQ
1e60: 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20 30 29  , pE1c, pE2c, 0)
1e70: 3b 0a 20 20 69 66 28 20 70 45 20 26 26 20 69 73  ;.  if( pE && is
1e80: 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20  OuterJoin ){.   
1e90: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1ea0: 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  (pE, EP_FromJoin
1eb0: 29 3b 0a 20 20 20 20 70 45 2d 3e 69 52 69 67 68  );.    pE->iRigh
1ec0: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69 52 69  tJoinTable = iRi
1ed0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20  ghtJoinTable;.  
1ee0: 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d 20 73 71  }.  *ppExpr = sq
1ef0: 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
1f00: 72 73 65 2d 3e 64 62 2c 2a 70 70 45 78 70 72 2c  rse->db,*ppExpr,
1f10: 20 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   pE);.}../*.** S
1f20: 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  et the EP_FromJo
1f30: 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61  in property on a
1f40: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
1f50: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
1f60: 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65  ..** And set the
1f70: 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
1f80: 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20  Table to iTable 
1f90: 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69  for every term i
1fa0: 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  n the.** express
1fb0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ion..**.** The E
1fc0: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
1fd0: 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74  rty is used on t
1fe0: 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65  erms of an expre
1ff0: 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a  ssion to tell.**
2000: 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20   the LEFT OUTER 
2010: 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20  JOIN processing 
2020: 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20  logic that this 
2030: 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20  term is part of 
2040: 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74  the.** join rest
2050: 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65  riction specifie
2060: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
2070: 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20  SING clause and 
2080: 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66  not a part.** of
2090: 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61   the more genera
20a0: 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  l WHERE clause. 
20b0: 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65   These terms are
20c0: 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74   moved over to t
20d0: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
20e0: 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70  se during join p
20f0: 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65  rocessing but we
2100: 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
2110: 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f  r that they.** o
2120: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
2130: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2140: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  use..**.** The E
2150: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
2160: 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48  ble tells the WH
2170: 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
2180: 73 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a  ssing that the.*
2190: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  * expression dep
21a0: 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52  ends on table iR
21b0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76  ightJoinTable ev
21c0: 65 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65  en if that table
21d0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69   is not.** expli
21e0: 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20  citly mentioned 
21f0: 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
2200: 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61  n.  That informa
2210: 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a  tion is needed.*
2220: 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65  * for cases like
2230: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
2240: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
2250: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
2260: 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74   t1.a=t2.b AND t
2270: 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  1.x=5.**.** The 
2280: 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65  where clause nee
2290: 64 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20  ds to defer the 
22a0: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20  handling of the 
22b0: 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75  t1.x=5.** term u
22c0: 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74  ntil after the t
22d0: 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f  2 loop of the jo
22e0: 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79  in.  In that way
22f0: 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72  , a.** NULL t2 r
2300: 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  ow will be inser
2310: 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e  ted whenever t1.
2320: 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20  x!=5.  If we do 
2330: 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65  not.** defer the
2340: 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e   handling of t1.
2350: 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  x=5, it will be 
2360: 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69  processed immedi
2370: 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74  ately.** after t
2380: 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72  he t1 loop and r
2390: 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35  ows with t1.x!=5
23a0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65   will never appe
23b0: 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74  ar in.** the out
23c0: 70 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e  put, which is in
23d0: 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74  correct..*/.stat
23e0: 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45  ic void setJoinE
23f0: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
2400: 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c   iTable){.  whil
2410: 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72  e( p ){.    Expr
2420: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
2430: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
2440: 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61   p->iRightJoinTa
2450: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
2460: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d    setJoinExpr(p-
2470: 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b  >pLeft, iTable);
2480: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67  .    p = p->pRig
2490: 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a  ht;.  } .}../*.*
24a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70  * This routine p
24b0: 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a 6f 69  rocesses the joi
24c0: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
24d0: 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  r a SELECT state
24e0: 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20  ment..** ON and 
24f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72  USING clauses ar
2500: 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
2510: 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 66 20   extra terms of 
2520: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2530: 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69  ..** NATURAL joi
2540: 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65 20 65  ns also create e
2550: 78 74 72 61 20 57 48 45 52 45 20 63 6c 61 75 73  xtra WHERE claus
2560: 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54  e terms..**.** T
2570: 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20 46 52  he terms of a FR
2580: 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f  OM clause are co
2590: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 53  ntained in the S
25a0: 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72 75 63  elect.pSrc struc
25b0: 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66  ture..** The lef
25c0: 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69 73 20  t most table is 
25d0: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
25e0: 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 20  in Select.pSrc. 
25f0: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
2600: 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  ** table is the 
2610: 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54 68 65  last entry.  The
2620: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 69   join operator i
2630: 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 65 6e  s held in the en
2640: 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65  try to.** the le
2650: 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72 79 20  ft.  Thus entry 
2660: 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a  0 contains the j
2670: 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  oin operator for
2680: 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77 65 65   the join betwee
2690: 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30 20 61  n.** entries 0 a
26a0: 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72  nd 1.  Any ON or
26b0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
26c0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
26d0: 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61  he join are.** a
26e0: 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74 6f 20  lso attached to 
26f0: 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a  the left entry..
2700: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2710: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
2720: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
2730: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a  encountered..*/.
2740: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
2750: 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72  eProcessJoin(Par
2760: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
2770: 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  ct *p){.  SrcLis
2780: 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20  t *pSrc;        
2790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
27a0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
27b0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
27c0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
27f0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
2800: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74  List_item *pLeft
2810: 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 74 61  ;     /* Left ta
2820: 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64  ble being joined
2830: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
2840: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69 67 68  List_item *pRigh
2850: 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74 20 74  t;    /* Right t
2860: 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65  able being joine
2870: 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70  d */..  pSrc = p
2880: 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66 74 20  ->pSrc;.  pLeft 
2890: 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20  = &pSrc->a[0];. 
28a0: 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65 66 74   pRight = &pLeft
28b0: 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [1];.  for(i=0; 
28c0: 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i<pSrc->nSrc-1; 
28d0: 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70  i++, pRight++, p
28e0: 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62  Left++){.    Tab
28f0: 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d 20 70  le *pLeftTab = p
2900: 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Left->pTab;.    
2910: 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62  Table *pRightTab
2920: 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b   = pRight->pTab;
2930: 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74 65 72  .    int isOuter
2940: 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  ;..    if( pLeft
2950: 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74  Tab==0 || pRight
2960: 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Tab==0 ) continu
2970: 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d  e;.    isOuter =
2980: 20 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79   (pRight->jointy
2990: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
29a0: 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  0;..    /* When 
29b0: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
29c0: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ord is present, 
29d0: 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  add WHERE clause
29e0: 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a   terms for.    *
29f0: 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74  * every column t
2a00: 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c  hat the two tabl
2a10: 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f  es have in commo
2a20: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
2a30: 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79  ( pRight->jointy
2a40: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
2a50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  ){.      if( pRi
2a60: 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67  ght->pOn || pRig
2a70: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
2a80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2a90: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
2aa0: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61   NATURAL join ma
2ab0: 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20  y not have ".   
2ac0: 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f          "an ON o
2ad0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c  r USING clause",
2ae0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
2af0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
2b00: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2b10: 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  pLeftTab->nCol; 
2b20: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
2b30: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 65 66  ar *zName = pLef
2b40: 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  tTab->aCol[j].zN
2b50: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
2b60: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69   columnIndex(pRi
2b70: 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d  ghtTab, zName)>=
2b80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
2b90: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
2ba0: 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65 66 74  se, zName, pLeft
2bb0: 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69  Tab, pLeft->zAli
2bc0: 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  as, .           
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 70 52 69 67 68 74 54 61 62 2c 20 70 52     pRightTab, pR
2bf0: 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20  ight->zAlias,.  
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
2c20: 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d  ht->iCursor, &p-
2c30: 3e 70 57 68 65 72 65 2c 20 69 73 4f 75 74 65 72  >pWhere, isOuter
2c40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20  );.          .  
2c50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2c60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
2c70: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
2c80: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2c90: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
2ca0: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
2cb0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
2cc0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
2cd0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2ce0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2cf0: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
2d00: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
2d10: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
2d20: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
2d30: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
2d40: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
2d50: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
2d60: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
2d70: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2d80: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
2d90: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
2da0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
2db0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
2dc0: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->pOn ){.      i
2dd0: 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74  f( isOuter ) set
2de0: 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d  JoinExpr(pRight-
2df0: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
2e00: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
2e10: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
2e20: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
2e30: 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  >db, p->pWhere, 
2e40: 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20  pRight->pOn);.  
2e50: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20      pRight->pOn 
2e60: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
2e70: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
2e80: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
2e90: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
2ea0: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
2eb0: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
2ec0: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
2ed0: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
2ee0: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
2ef0: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
2f00: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
2f10: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
2f20: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
2f30: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
2f40: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
2f50: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
2f60: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
2f70: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
2f80: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
2f90: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
2fa0: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
2fb0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
2fc0: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
2fd0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
2fe0: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
2ff0: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
3000: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73   if( pRight->pUs
3010: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
3020: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69  ist *pList = pRi
3030: 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  ght->pUsing;.   
3040: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
3050: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
3060: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
3070: 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a  ame = pList->a[j
3080: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
3090: 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   if( columnIndex
30a0: 28 70 4c 65 66 74 54 61 62 2c 20 7a 4e 61 6d 65  (pLeftTab, zName
30b0: 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64  )<0 || columnInd
30c0: 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e  ex(pRightTab, zN
30d0: 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  ame)<0 ){.      
30e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
30f0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
3100: 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63  not join using c
3110: 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d  olumn %s - colum
3120: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
3130: 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20  "not present in 
3140: 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e  both tables", zN
3150: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
3160: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
3170: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57    }.        addW
3180: 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c  hereTerm(pParse,
3190: 20 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62   zName, pLeftTab
31a0: 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c  , pLeft->zAlias,
31b0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
31d0: 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d  ightTab, pRight-
31e0: 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20 20  >zAlias,.       
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69 43 75       pRight->iCu
3210: 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  rsor, &p->pWhere
3220: 2c 20 69 73 4f 75 74 65 72 29 3b 0a 20 20 20 20  , isOuter);.    
3230: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
3240: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
3250: 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69  ** Insert code i
3260: 6e 74 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c  nto "v" that wil
3270: 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f 72  l push the recor
3280: 64 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  d on the top of 
3290: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74  the.** stack int
32a0: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
32b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
32c0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
32d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
32e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
32f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
3300: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
3310: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
3320: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
3330: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
3340: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
3350: 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ole SELECT state
3360: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ment */.  int re
3370: 67 44 61 74 61 20 20 20 20 20 20 20 20 20 20 20  gData           
3380: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
3390: 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20  ding data to be 
33a0: 73 6f 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 56  sorted */.){.  V
33b0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
33c0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6e 45  >pVdbe;.  int nE
33d0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
33e0: 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20 72 65 67  nExpr;.  int reg
33f0: 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
3400: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
3410: 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69  e, nExpr+2);.  i
3420: 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  nt regRecord = s
3430: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
3440: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
3450: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
3460: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
3470: 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30  erBy, regBase, 0
3480: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3490: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
34a0: 75 65 6e 63 65 2c 20 70 4f 72 64 65 72 42 79 2d  uence, pOrderBy-
34b0: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61  >iECursor, regBa
34c0: 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73 71 6c  se+nExpr);.  sql
34d0: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
34e0: 28 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61  (pParse, regData
34f0: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b  , regBase+nExpr+
3500: 31 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  1, 1);.  sqlite3
3510: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
3520: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
3530: 42 61 73 65 2c 20 6e 45 78 70 72 20 2b 20 32 2c  Base, nExpr + 2,
3540: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
3550: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3560: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
3570: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
3580: 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rsor, regRecord)
3590: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
35a0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
35b0: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
35c0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
35d0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
35e0: 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72 2b 32  regBase, nExpr+2
35f0: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  );.  if( pSelect
3600: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
3610: 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
3620: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74  ;.    int iLimit
3630: 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  ;.    if( pSelec
3640: 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20 20  t->iOffset ){.  
3650: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
3660: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 3b  lect->iOffset+1;
3670: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3680: 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65    iLimit = pSele
3690: 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  ct->iLimit;.    
36a0: 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  }.    addr1 = sq
36b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
36c0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
36d0: 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
36e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
36f0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69 6d 69  OP_AddImm, iLimi
3700: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72  t, -1);.    addr
3710: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
3720: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
3730: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3740: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3750: 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dr1);.    sqlite
3760: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3770: 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72 42 79  P_Last, pOrderBy
3780: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
3790: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37a0: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
37b0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
37c0: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
37d0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
37e0: 20 61 64 64 72 32 29 3b 0a 20 20 20 20 70 53 65   addr2);.    pSe
37f0: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  lect->iLimit = 0
3800: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3810: 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  dd code to imple
3820: 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a  ment the OFFSET.
3830: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3840: 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62  odeOffset(.  Vdb
3850: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
3860: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
3870: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
3880: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
3890: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
38a0: 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
38b0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  g coded */.  int
38c0: 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f   iContinue     /
38d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
38e0: 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e 74 20  kip the current 
38f0: 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69  record */.){.  i
3900: 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 26 26  f( p->iOffset &&
3910: 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 7b   iContinue!=0 ){
3920: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  .    int addr;. 
3930: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3940: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
3950: 6d 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 2d  m, p->iOffset, -
3960: 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  1);.    addr = s
3970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
3980: 28 76 2c 20 4f 50 5f 49 66 4e 65 67 2c 20 70 2d  (v, OP_IfNeg, p-
3990: 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73  >iOffset);.    s
39a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
39b0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
39c0: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
39d0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
39e0: 22 73 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63  "skip OFFSET rec
39f0: 6f 72 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c  ords"));.    sql
3a00: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3a10: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d  (v, addr);.  }.}
3a20: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
3a30: 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b   that will check
3a40: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
3a50: 65 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74  e N registers st
3a60: 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a  arting at iMem.*
3a70: 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63  * form a distinc
3a80: 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69  t entry.  iTab i
3a90: 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  s a sorting inde
3aa0: 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65  x that holds pre
3ab0: 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20  viously.** seen 
3ac0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
3ad0: 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41  the N values.  A
3ae0: 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61   new entry is ma
3af0: 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66  de in iTab.** if
3b00: 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76   the current N v
3b10: 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a  alues are new..*
3b20: 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61  *.** A jump to a
3b30: 64 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64  ddrRepeat is mad
3b40: 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61  e and the N+1 va
3b50: 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20  lues are popped 
3b60: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63  from the.** stac
3b70: 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65  k if the top N e
3b80: 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20  lements are not 
3b90: 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61  distinct..*/.sta
3ba0: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73  tic void codeDis
3bb0: 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a  tinct(.  Parse *
3bc0: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
3bd0: 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
3be0: 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
3bf0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  xt */.  int iTab
3c00: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ,          /* A 
3c10: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73  sorting index us
3c20: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64  ed to test for d
3c30: 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20  istinctness */. 
3c40: 20 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c   int addrRepeat,
3c50: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68      /* Jump to h
3c60: 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69  ere if not disti
3c70: 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20  nct */.  int N, 
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3c90: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
3ca0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20  s */.  int iMem 
3cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
3cc0: 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b  st element */.){
3cd0: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
3ce0: 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61  t r1;..  v = pPa
3cf0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31  rse->pVdbe;.  r1
3d00: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
3d10: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
3d20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3d30: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
3d40: 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29  rd, iMem, N, r1)
3d50: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3d60: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f 75 6e  ddOp3(v, OP_Foun
3d70: 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52 65 70  d, iTab, addrRep
3d80: 65 61 74 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  eat, r1);.  sqli
3d90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3da0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
3db0: 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  Tab, r1);.  sqli
3dc0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
3dd0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
3de0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
3df0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
3e00: 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20  e when a SELECT 
3e10: 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  is used within a
3e20: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
3e30: 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20  * (example:  "a 
3e40: 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
3e50: 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69  M table)") but i
3e60: 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  t has more than 
3e70: 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75  1 result.** colu
3e80: 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20  mn.  We do this 
3e90: 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  in a subroutine 
3ea0: 62 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f  because the erro
3eb0: 72 20 6f 63 63 75 72 73 20 69 6e 20 6d 75 6c 74  r occurs in mult
3ec0: 69 70 6c 65 0a 2a 2a 20 70 6c 61 63 65 73 2e 0a  iple.** places..
3ed0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
3ee0: 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d  eckForMultiColum
3ef0: 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20  nSelectError(.  
3f00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3f10: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
3f20: 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65  ntext. */.  Sele
3f30: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
3f40: 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
3f50: 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  of SELECT result
3f60: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72  s */.  int nExpr
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3f80: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
3f90: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
3fa0: 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b   by SELECT */.){
3fb0: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
3fc0: 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69  Dest->eDest;.  i
3fd0: 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65  f( nExpr>1 && (e
3fe0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
3ff0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29   eDest==SRT_Set)
4000: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4010: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4020: 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72  "only a single r
4030: 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f  esult allowed fo
4040: 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45  r ".       "a SE
4050: 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72  LECT that is par
4060: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
4070: 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  on");.    return
4080: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
4090: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
40a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
40b0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
40c0: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
40d0: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
40e0: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
40f0: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
4100: 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e 43 6f  f srcTab and nCo
4110: 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20 7a 65  lumn are both ze
4120: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 45 4c  ro, then the pEL
4130: 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  ist expressions.
4140: 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ** are evaluated
4150: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
4160: 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
4170: 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43 6f 6c  is row.  If nCol
4180: 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20 64 61  umn>0.** then da
4190: 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f  ta is pulled fro
41a0: 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c  m srcTab and pEL
41b0: 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ist is used only
41c0: 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a 20 64   to get the.** d
41d0: 61 74 61 74 79 70 65 73 20 66 6f 72 20 65 61 63  atatypes for eac
41e0: 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61  h column..*/.sta
41f0: 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49  tic void selectI
4200: 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73  nnerLoop(.  Pars
4210: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
4220: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
4230: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
4240: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
4250: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
4260: 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74  mplete select st
4270: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
4280: 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ded */.  ExprLis
4290: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
42a0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
42b0: 65 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74  es being extract
42c0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54  ed */.  int srcT
42d0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
42e0: 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f  /* Pull data fro
42f0: 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  m this table */.
4300: 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20    int nColumn,  
4310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4320: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
4330: 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  n the source tab
4340: 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  le */.  ExprList
4350: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20   *pOrderBy,     
4360: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
4370: 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75 73 69  sort results usi
4380: 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20  ng this key */. 
4390: 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c 20 20   int distinct,  
43a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e           /* If >
43b0: 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20 72 65  =0, make sure re
43c0: 73 75 6c 74 73 20 61 72 65 20 64 69 73 74 69 6e  sults are distin
43d0: 63 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ct */.  SelectDe
43e0: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
43f0: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
4400: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
4410: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
4420: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
4430: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
4440: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
4450: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
4460: 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
4470: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
4480: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
4490: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
44a0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
44b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
44c0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61   int i;.  int ha
44d0: 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
44e0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
44f0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
4500: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
4510: 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b    int regResult;
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4530: 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79   Start of memory
4540: 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
4550: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  set */.  int eDe
4560: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
4570: 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64  t;   /* How to d
4580: 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74  ispose of result
4590: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d  s */.  int iParm
45a0: 20 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b   = pDest->iParm;
45b0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
45c0: 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c  ment to disposal
45d0: 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74   method */.  int
45e0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20   nResultCol;    
45f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4600: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
4610: 75 6d 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 76  umns */..  if( v
4620: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4630: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
4640: 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e  0 );.  hasDistin
4650: 63 74 20 3d 20 64 69 73 74 69 6e 63 74 3e 3d 30  ct = distinct>=0
4660: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
4670: 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69  ==0 && !hasDisti
4680: 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f  nct ){.    codeO
4690: 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
46a0: 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tinue);.  }..  /
46b0: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
46c0: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
46d0: 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e  */.  if( nColumn
46e0: 3e 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 75 6c  >0 ){.    nResul
46f0: 74 43 6f 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a  tCol = nColumn;.
4700: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65    }else{.    nRe
4710: 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74  sultCol = pEList
4720: 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69  ->nExpr;.  }.  i
4730: 66 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d  f( pDest->iMem==
4740: 30 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e  0 ){.    pDest->
4750: 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
4760: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73 74  Mem+1;.    pDest
4770: 2d 3e 6e 4d 65 6d 20 3d 20 6e 52 65 73 75 6c 74  ->nMem = nResult
4780: 43 6f 6c 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Col;.    pParse-
4790: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
47a0: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Col;.  }else if(
47b0: 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 21 3d 6e 52   pDest->nMem!=nR
47c0: 65 73 75 6c 74 43 6f 6c 20 29 7b 0a 20 20 20 20  esultCol ){.    
47d0: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
47e0: 77 68 65 6e 20 74 77 6f 20 53 45 4c 45 43 54 73  when two SELECTs
47f0: 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   of a compound S
4800: 45 4c 45 43 54 20 68 61 76 65 20 64 69 66 66 65  ELECT have diffe
4810: 72 69 6e 67 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  ring.    ** numb
4820: 65 72 73 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ers of result co
4830: 6c 75 6d 6e 73 2e 20 20 54 68 65 20 65 72 72 6f  lumns.  The erro
4840: 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 62  r message will b
4850: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 0a 20  e generated by. 
4860: 20 20 20 2a 2a 20 61 20 68 69 67 68 65 72 2d 6c     ** a higher-l
4870: 65 76 65 6c 20 72 6f 75 74 69 6e 65 2e 20 2a 2f  evel routine. */
4880: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
4890: 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70  .  regResult = p
48a0: 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20 20 69 66  Dest->iMem;.  if
48b0: 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20  ( nColumn>0 ){. 
48c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
48d0: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
48e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
48f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
4900: 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72 65  n, srcTab, i, re
4910: 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20  gResult+i);.    
4920: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44  }.  }else if( eD
4930: 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
4940: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
4950: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
4960: 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65  an EXISTS(...) e
4970: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61  xpression, the a
4980: 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c  ctual.    ** val
4990: 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ues returned by 
49a0: 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e  the SELECT are n
49b0: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
49c0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
49d0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
49e0: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
49f0: 72 65 67 52 65 73 75 6c 74 2c 20 65 44 65 73 74  regResult, eDest
4a00: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29 3b 0a 20  ==SRT_Output);. 
4a10: 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e   }.  nColumn = n
4a20: 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a  ResultCol;..  /*
4a30: 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   If the DISTINCT
4a40: 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65   keyword was pre
4a50: 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45  sent on the SELE
4a60: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  CT statement.  *
4a70: 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68  * and this row h
4a80: 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66  as been seen bef
4a90: 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ore, then do not
4aa0: 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20   make this row. 
4ab0: 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20   ** part of the 
4ac0: 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69  result..  */.  i
4ad0: 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29  f( hasDistinct )
4ae0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
4af0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  List!=0 );.    a
4b00: 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e  ssert( pEList->n
4b10: 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b  Expr==nColumn );
4b20: 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63  .    codeDistinc
4b30: 74 28 70 50 61 72 73 65 2c 20 64 69 73 74 69 6e  t(pParse, distin
4b40: 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e  ct, iContinue, n
4b50: 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 73 75 6c  Column, regResul
4b60: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  t);.    if( pOrd
4b70: 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
4b80: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
4b90: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
4ba0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 63    }.  }..  if( c
4bb0: 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
4bc0: 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
4bd0: 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c  arse, pDest, pEL
4be0: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
4bf0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
4c00: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
4c10: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
4c20: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
4c30: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
4c40: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
4c50: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
4c60: 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ** table iParm..
4c70: 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
4c80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
4c90: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63  UND_SELECT.    c
4ca0: 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b  ase SRT_Union: {
4cb0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
4cc0: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
4cd0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
4ce0: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
4cf0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
4d00: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
4d10: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
4d20: 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  n, r1);.      sq
4d30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4d40: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
4d50: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
4d60: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
4d70: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
4d80: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
4d90: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
4da0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
4db0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
4dc0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
4dd0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
4de0: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
4df0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
4e00: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
4e10: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
4e20: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
4e30: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
4e40: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
4e50: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
4e60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4e70: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
4e80: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
4e90: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29  Result, nColumn)
4ea0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4eb0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
4ec0: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
4ed0: 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
4ee0: 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
4ef0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4f00: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
4f10: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
4f20: 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
4f30: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
4f40: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
4f50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4f60: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
4f70: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
4f80: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29  lt, nColumn, r1)
4f90: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
4fa0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
4fb0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
4fc0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
4fd0: 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d   p, r1);.      }
4fe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
4ff0: 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
5000: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5010: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5020: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
5030: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
5040: 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  m, r2);.        
5050: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5060: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
5070: 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a  iParm, r1, r2);.
5080: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5090: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
50a0: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
50b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
50c0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
50d0: 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
50e0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  }.      sqlite3R
50f0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
5100: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
5110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5120: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5130: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
5140: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65  /* If we are cre
5150: 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20  ating a set for 
5160: 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c  an "expr IN (SEL
5170: 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72  ECT ...)" constr
5180: 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  uct,.    ** then
5190: 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   there should be
51a0: 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f   a single item o
51b0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72  n the stack.  Wr
51c0: 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ite this.    ** 
51d0: 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65  item into the se
51e0: 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67  t table with bog
51f0: 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a  us data..    */.
5200: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
5210: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
5220: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
5230: 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69 74        p->affinit
5240: 79 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  y = sqlite3Compa
5250: 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73  reAffinity(pELis
5260: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
5270: 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b  Dest->affinity);
5280: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
5290: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  rBy ){.        /
52a0: 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63  * At first glanc
52b0: 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e  e you would thin
52c0: 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d  k we could optim
52d0: 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20  ize out the.    
52e0: 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
52f0: 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e  in this case sin
5300: 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20  ce the order of 
5310: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73  entries in the s
5320: 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  et.        ** do
5330: 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20  es not matter.  
5340: 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20  But there might 
5350: 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  be a LIMIT claus
5360: 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20  e, in which.    
5370: 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20      ** case the 
5380: 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65  order does matte
5390: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73  r */.        pus
53a0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
53b0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
53c0: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
53d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
53e0: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
53f0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
5400: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
5410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
5420: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5430: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31 2c 20  , regResult, 1, 
5440: 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79  r1, &p->affinity
5450: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
5460: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
5470: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
5480: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
5490: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
54a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
54b0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
54c0: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
54d0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
54e0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
54f0: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r1);.      }.  
5500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5510: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20  ..    /* If any 
5520: 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65  row exist in the
5530: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
5540: 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
5550: 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
5560: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
5570: 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
5580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5590: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
55a0: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f   iParm);.      /
55b0: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
55c0: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
55d0: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
55e0: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
55f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5600: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
5610: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
5620: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
5630: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
5640: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
5650: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
5660: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
5670: 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
5680: 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
5690: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
56a0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
56b0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
56c0: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
56d0: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
56e0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
56f0: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
5700: 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  r(pParse, pOrder
5710: 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  By, p, regResult
5720: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5730: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5740: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
5750: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 69  se, regResult, i
5760: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
5770: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
5780: 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
5790: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
57a0: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
57b0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
57c0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
57d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
57e0: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
57f0: 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68 65 20      /* Send the 
5800: 64 61 74 61 20 74 6f 20 74 68 65 20 63 61 6c 6c  data to the call
5810: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 6f 72  back function or
5820: 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
5830: 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20 2a 2a  .  In the.    **
5840: 20 63 61 73 65 20 6f 66 20 61 20 73 75 62 72 6f   case of a subro
5850: 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62 72 6f  utine, the subro
5860: 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69 73 20  utine itself is 
5870: 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 0a  responsible for.
5880: 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67 20 74      ** popping t
5890: 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  he data from the
58a0: 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20   stack..    */. 
58b0: 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f     case SRT_Coro
58c0: 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73 65 20  utine:.    case 
58d0: 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a 20 20  SRT_Output: {.  
58e0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
58f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
5900: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
5910: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
5920: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5930: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5940: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
5950: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  esult, nColumn, 
5960: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73  r1);.        pus
5970: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
5980: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
5990: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
59a0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
59b0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
59c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
59d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
59e0: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  utine ){.       
59f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5a00: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
5a10: 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20  pDest->iParm);. 
5a20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5a30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5a40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
5a50: 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74  ltRow, regResult
5a60: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
5a70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
5a80: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
5a90: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
5aa0: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  sult, nColumn);.
5ab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5ac0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
5ad0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5ae0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20  OMIT_TRIGGER).  
5af0: 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
5b00: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20   results.  This 
5b10: 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45  is used for SELE
5b20: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  CT statements in
5b30: 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  side.    ** the 
5b40: 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45  body of a TRIGGE
5b50: 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  R.  The purpose 
5b60: 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20  of such selects 
5b70: 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a  is to call.    *
5b80: 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  * user-defined f
5b90: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  unctions that ha
5ba0: 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e  ve side effects.
5bb0: 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65    We do not care
5bc0: 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68  .    ** about th
5bd0: 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73  e actual results
5be0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a   of the select..
5bf0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
5c00: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
5c10: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  rt( eDest==SRT_D
5c20: 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20  iscard );.      
5c30: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
5c40: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  dif.  }..  /* Ju
5c50: 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
5c60: 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
5c70: 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
5c80: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
5c90: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 61  >iLimit ){.    a
5ca0: 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 3d  ssert( pOrderBy=
5cb0: 3d 30 20 29 3b 20 20 2f 2a 20 49 66 20 74 68 65  =0 );  /* If the
5cc0: 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
5cd0: 59 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 0a 20  Y, the call to. 
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cf0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 75             ** pu
5d00: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20 77  shOntoSorter() w
5d10: 6f 75 6c 64 20 68 61 76 65 20 63 6c 65 61 72 65  ould have cleare
5d20: 64 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  d p->iLimit */. 
5d30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5d40: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
5d50: 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31  m, p->iLimit, -1
5d60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5d70: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
5d80: 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
5d90: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 7d  , iBreak);.  }.}
5da0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
5db0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
5dc0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
5dd0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
5de0: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
5df0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
5e00: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
5e10: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
5e20: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
5e30: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
5e40: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
5e50: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
5e60: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
5e70: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
5e80: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
5e90: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
5ea0: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
5eb0: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
5ec0: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
5ed0: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
5ee0: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
5ef0: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
5f00: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
5f10: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
5f20: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
5f30: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
5f40: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
5f50: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
5f60: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
5f70: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
5f80: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
5f90: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
5fa0: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
5fb0: 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20  n from malloc.  
5fc0: 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  The calling.** f
5fd0: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
5fe0: 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e  nsible for seein
5ff0: 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75  g that this stru
6000: 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61  cture is eventua
6010: 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20 20 41  lly.** freed.  A
6020: 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  dd the KeyInfo s
6030: 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20  tructure to the 
6040: 50 34 20 66 69 65 6c 64 20 6f 66 20 61 6e 20 6f  P4 field of an o
6050: 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a 20 50  pcode using.** P
6060: 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
6070: 46 20 69 73 20 74 68 65 20 75 73 75 61 6c 20 77  F is the usual w
6080: 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20 77 69  ay of dealing wi
6090: 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  th this..*/.stat
60a0: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
60b0: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
60c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
60d0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
60e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
60f0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
6100: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49  nt nExpr;.  KeyI
6110: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74  nfo *pInfo;.  st
6120: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
6130: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
6140: 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70   i;..  nExpr = p
6150: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
6160: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
6170: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
6180: 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20 2b 20  izeof(*pInfo) + 
6190: 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f  nExpr*(sizeof(Co
61a0: 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20  llSeq*)+1) );.  
61b0: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
61c0: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
61d0: 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e 66 6f  er = (u8*)&pInfo
61e0: 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a  ->aColl[nExpr];.
61f0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c      pInfo->nFiel
6200: 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20 20 70  d = nExpr;.    p
6210: 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
6220: 64 62 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  db);.    pInfo->
6230: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 66 6f 72  db = db;.    for
6240: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (i=0, pItem=pLis
6250: 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69  t->a; i<nExpr; i
6260: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
6270: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
6280: 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20  ll;.      pColl 
6290: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
62a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
62b0: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
62c0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
62d0: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
62e0: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
62f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
6300: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  fo->aColl[i] = p
6310: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66  Coll;.      pInf
6320: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
6330: 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72   = pItem->sortOr
6340: 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
6350: 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d   return pInfo;.}
6360: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
6370: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
6380: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
6390: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
63a0: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
63b0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
63c0: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
63d0: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
63e0: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
63f0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
6400: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
6410: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
6420: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
6430: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
6440: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
6450: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
6460: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
6470: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
6480: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
6490: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
64a0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
64b0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
64c0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
64d0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
64e0: 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ent */.  Vdbe *v
64f0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
6500: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
6510: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
6520: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
6530: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
6540: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
6550: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
6560: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
6570: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
6580: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
6590: 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73  nt addrBreak = s
65a0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
65b0: 62 65 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a  bel(v);     /* J
65c0: 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74  ump here to exit
65d0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
65e0: 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  ddrContinue = sq
65f0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
6600: 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20  el(v);  /* Jump 
6610: 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79  here for next cy
6620: 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  cle */.  int add
6630: 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  r;.  int iTab;. 
6640: 20 69 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d   int pseudoTab =
6650: 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   0;.  ExprList *
6660: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
6670: 72 64 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65  rderBy;..  int e
6680: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
6690: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
66a0: 20 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b   = pDest->iParm;
66b0: 0a 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a  ..  int regRow;.
66c0: 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a    int regRowid;.
66d0: 0a 20 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72  .  iTab = pOrder
66e0: 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20  By->iECursor;.  
66f0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
6700: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
6710: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
6720: 0a 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d  .    pseudoTab =
6730: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
6740: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6750: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74  AddOp2(v, OP_Set
6760: 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 6e  NumColumns, 0, n
6770: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c  Column);.    sql
6780: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6790: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
67a0: 20 70 73 65 75 64 6f 54 61 62 2c 20 65 44 65 73   pseudoTab, eDes
67b0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29 3b 0a  t==SRT_Output);.
67c0: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b    }.  addr = 1 +
67d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
67e0: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69  p2(v, OP_Sort, i
67f0: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
6800: 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
6810: 20 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65   p, addrContinue
6820: 29 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20 73 71  );.  regRow = sq
6830: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
6840: 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 52 6f  pParse);.  regRo
6850: 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  wid = sqlite3Get
6860: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6870: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6880: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
6890: 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42  n, iTab, pOrderB
68a0: 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20 72 65  y->nExpr + 1, re
68b0: 67 52 6f 77 29 3b 0a 20 20 73 77 69 74 63 68 28  gRow);.  switch(
68c0: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
68d0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
68e0: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
68f0: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  Tab: {.      sql
6900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6910: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
6920: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b  Parm, regRowid);
6930: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6940: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
6950: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
6960: 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b  gRow, regRowid);
6970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6980: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
6990: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
69a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
69b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
69c0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
69d0: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
69e0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
69f0: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
6a00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6a10: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
6a20: 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20  Record, regRow, 
6a30: 31 2c 20 72 65 67 52 6f 77 69 64 2c 20 26 70 2d  1, regRowid, &p-
6a40: 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  >affinity, 1);. 
6a50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6a60: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
6a70: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
6a80: 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ow, 1);.      sq
6a90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6aa0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
6ab0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
6ac0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6ad0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
6ae0: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
6af0: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
6b00: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
6b10: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
6b20: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
6b30: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
6b40: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
6b50: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
6b60: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
6b70: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
6b80: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
6b90: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75  .    case SRT_Ou
6ba0: 74 70 75 74 3a 0a 20 20 20 20 63 61 73 65 20 53  tput:.    case S
6bb0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a  RT_Coroutine: {.
6bc0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
6bd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6be0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
6bf0: 65 72 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29  er, 1, regRowid)
6c00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6c10: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6c20: 49 6e 73 65 72 74 2c 20 70 73 65 75 64 6f 54 61  Insert, pseudoTa
6c30: 62 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  b, regRow, regRo
6c40: 77 69 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  wid);.      for(
6c50: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
6c60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i++){.        as
6c70: 73 65 72 74 28 20 72 65 67 52 6f 77 21 3d 70 44  sert( regRow!=pD
6c80: 65 73 74 2d 3e 69 4d 65 6d 2b 69 20 29 3b 0a 20  est->iMem+i );. 
6c90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6ca0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
6cb0: 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61 62  olumn, pseudoTab
6cc0: 2c 20 69 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d  , i, pDest->iMem
6cd0: 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +i);.      }.   
6ce0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
6cf0: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
6d00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6d10: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
6d20: 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 4d  ltRow, pDest->iM
6d30: 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  em, nColumn);.  
6d40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6d50: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
6d60: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65  ange(pParse, pDe
6d70: 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d  st->iMem, nColum
6d80: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
6d90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6da0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
6db0: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
6dc0: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
6dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6de0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
6df0: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
6e00: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
6e10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
6e20: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
6e30: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
6e40: 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65  egRow);.  sqlite
6e50: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
6e60: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
6e70: 29 3b 0a 0a 20 20 2f 2a 20 4c 49 4d 49 54 20 68  );..  /* LIMIT h
6e80: 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e  as been implemen
6e90: 74 65 64 20 62 79 20 74 68 65 20 70 75 73 68 4f  ted by the pushO
6ea0: 6e 74 6f 53 6f 72 74 65 72 28 29 20 72 6f 75 74  ntoSorter() rout
6eb0: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ine..  */.  asse
6ec0: 72 74 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30  rt( p->iLimit==0
6ed0: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f   );..  /* The bo
6ee0: 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
6ef0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
6f00: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6f10: 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  v, addrContinue)
6f20: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
6f30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
6f40: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20  , iTab, addr);. 
6f50: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
6f60: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
6f70: 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 65 44  Break);.  if( eD
6f80: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
6f90: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
6fa0: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73  routine ){.    s
6fb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6fc0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73  (v, OP_Close, ps
6fd0: 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d  eudoTab, 0);.  }
6fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6ff0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
7000: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
7010: 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69  g the 'declarati
7020: 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a  on type' of the.
7030: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  ** expression pE
7040: 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20  xpr. The string 
7050: 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61  may be treated a
7060: 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20  s static by the 
7070: 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  caller..**.** Th
7080: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
7090: 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20  pe is the exact 
70a0: 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74  datatype definit
70b0: 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72  ion extracted fr
70c0: 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  om the.** origin
70d0: 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  al CREATE TABLE 
70e0: 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65  statement if the
70f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
7100: 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20   column. The.** 
7110: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
7120: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
7130: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45  ld is INTEGER. E
7140: 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65  xactly when an e
7150: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
7160: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
7170: 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  umn can be compl
7180: 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e  ex in the presen
7190: 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73  ce of subqueries
71a0: 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d  . The.** result-
71b0: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  set expression i
71c0: 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  n all of the fol
71d0: 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74  lowing SELECT st
71e0: 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20  atements is .** 
71f0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
7200: 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63  umn by this func
7210: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45  tion..**.**   SE
7220: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
7230: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
7240: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
7250: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
7260: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
7270: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c  M tbl);.**   SEL
7280: 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45  ECT abc FROM (SE
7290: 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20  LECT col AS abc 
72a0: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a  FROM tbl);.** .*
72b0: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
72c0: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65  n type for any e
72d0: 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20  xpression other 
72e0: 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73  than a column is
72f0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
7300: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
7310: 75 6d 6e 54 79 70 65 28 0a 20 20 4e 61 6d 65 43  umnType(.  NameC
7320: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20  ontext *pNC, .  
7330: 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63  Expr *pExpr,.  c
7340: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
7350: 69 67 69 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20  iginDb,.  const 
7360: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54  char **pzOriginT
7370: 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ab,.  const char
7380: 20 2a 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29   **pzOriginCol.)
7390: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
73a0: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61  zType = 0;.  cha
73b0: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
73c0: 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  Db = 0;.  char c
73d0: 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62  onst *zOriginTab
73e0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
73f0: 73 74 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d  st *zOriginCol =
7400: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69   0;.  int j;.  i
7410: 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70  f( pExpr==0 || p
7420: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20  NC->pSrcList==0 
7430: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73  ) return 0;..  s
7440: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
7450: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
7460: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
7470: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
7480: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
7490: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
74a0: 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68  olumn. Locate th
74b0: 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75  e table the colu
74c0: 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  mn is being.    
74d0: 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66    ** extracted f
74e0: 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65  rom in NameConte
74f0: 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69  xt.pSrcList. Thi
7500: 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72  s table may be r
7510: 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  eal.      ** dat
7520: 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
7530: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20   subquery..     
7540: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
7550: 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  *pTab = 0;      
7560: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73        /* Table s
7570: 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20  tructure column 
7580: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
7590: 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  m */.      Selec
75a0: 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20  t *pS = 0;      
75b0: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
75c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65   the column is e
75d0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
75e0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
75f0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
7600: 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63  ;  /* Index of c
7610: 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f  olumn in pTab */
7620: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e  .      while( pN
7630: 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  C && !pTab ){.  
7640: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
7650: 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  TabList = pNC->p
7660: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  SrcList;.       
7670: 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c   for(j=0;j<pTabL
7680: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
7690: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
76a0: 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor!=pExpr->iTab
76b0: 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20  le;j++);.       
76c0: 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d   if( j<pTabList-
76d0: 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20  >nSrc ){.       
76e0: 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69     pTab = pTabLi
76f0: 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20  st->a[j].pTab;. 
7700: 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54           pS = pT
7710: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65  abList->a[j].pSe
7720: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  lect;.        }e
7730: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
7740: 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b  NC = pNC->pNext;
7750: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7760: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
7770: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
7780: 20 2f 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20 20   /* FIX ME:.    
7790: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 6e 20      ** This can 
77a0: 6f 63 63 75 72 73 20 69 66 20 79 6f 75 20 68 61  occurs if you ha
77b0: 76 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ve something lik
77c0: 65 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 3b  e "SELECT new.x;
77d0: 22 20 69 6e 73 69 64 65 0a 20 20 20 20 20 20 20  " inside.       
77e0: 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2e 20 20   ** a trigger.  
77f0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
7800: 69 66 20 79 6f 75 20 72 65 66 65 72 65 6e 63 65  if you reference
7810: 20 74 68 65 20 73 70 65 63 69 61 6c 20 22 6e 65   the special "ne
7820: 77 22 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  w".        ** ta
7830: 62 6c 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ble in the resul
7840: 74 20 73 65 74 20 6f 66 20 61 20 73 65 6c 65 63  t set of a selec
7850: 74 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 68 61  t.  We do not ha
7860: 76 65 20 61 20 67 6f 6f 64 20 77 61 79 0a 20 20  ve a good way.  
7870: 20 20 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64        ** to find
7880: 20 74 68 65 20 61 63 74 75 61 6c 20 74 61 62 6c   the actual tabl
7890: 65 20 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c 20  e type, so call 
78a0: 69 74 20 22 54 45 58 54 22 2e 20 20 54 68 69 73  it "TEXT".  This
78b0: 20 69 73 20 72 65 61 6c 6c 79 0a 20 20 20 20 20   is really.     
78c0: 20 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20     ** something 
78d0: 6f 66 20 61 20 62 75 67 2c 20 62 75 74 20 49 20  of a bug, but I 
78e0: 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20  do not know how 
78f0: 74 6f 20 66 69 78 20 69 74 2e 0a 20 20 20 20 20  to fix it..     
7900: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
7910: 20 54 68 69 73 20 63 6f 64 65 20 64 6f 65 73 20   This code does 
7920: 6e 6f 74 20 70 72 6f 64 75 63 65 20 74 68 65 20  not produce the 
7930: 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2d  correct answer -
7940: 20 69 74 20 6a 75 73 74 20 70 72 65 76 65 6e 74   it just prevent
7950: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73  s.        ** a s
7960: 65 67 66 61 75 6c 74 2e 20 20 53 65 65 20 74 69  egfault.  See ti
7970: 63 6b 65 74 20 23 31 32 32 39 2e 0a 20 20 20 20  cket #1229..    
7980: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a      */.        z
7990: 54 79 70 65 20 3d 20 22 54 45 58 54 22 3b 0a 20  Type = "TEXT";. 
79a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
79b0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
79c0: 65 72 74 28 20 70 54 61 62 20 29 3b 0a 20 20 20  ert( pTab );.   
79d0: 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20     if( pS ){.   
79e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62       /* The "tab
79f0: 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20  le" is actually 
7a00: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
7a10: 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52  a view in the FR
7a20: 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  OM clause.      
7a30: 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45    ** of the SELE
7a40: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65  CT statement. Re
7a50: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
7a60: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72  tion type and or
7a70: 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  igin.        ** 
7a80: 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73  data for the res
7a90: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f  ult-set column o
7aa0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
7ab0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
7ac0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
7ad0: 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c   && iCol<pS->pEL
7ae0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
7af0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43          /* If iC
7b00: 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ol is less than 
7b10: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65  zero, then the e
7b20: 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73  xpression reques
7b30: 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ts the.         
7b40: 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65   ** rowid of the
7b50: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
7b60: 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73  iew. This expres
7b70: 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73  sion is legal (s
7b80: 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ee .          **
7b90: 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32   test case misc2
7ba0: 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79  .2.2) - it alway
7bb0: 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  s evaluates to N
7bc0: 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ULL..          *
7bd0: 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  /.          Name
7be0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
7bf0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
7c00: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69   pS->pEList->a[i
7c10: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  Col].pExpr;.    
7c20: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
7c30: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
7c40: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65           sNC.pNe
7c50: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
7c60: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
7c70: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
7c80: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
7c90: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
7ca0: 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a  , &zOriginDb, &z
7cb0: 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69  OriginTab, &zOri
7cc0: 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20  ginCol); .      
7cd0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
7ce0: 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  if( pTab->pSchem
7cf0: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
7d00: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  A real table */.
7d10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7d20: 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !pS );.        i
7d30: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
7d40: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
7d50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7d60: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
7d70: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
7d80: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
7d90: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
7da0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
7db0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
7dc0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e           zOrigin
7dd0: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
7de0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7df0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
7e00: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
7e10: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
7e20: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70    zOriginCol = p
7e30: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
7e40: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
7e50: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e  .        zOrigin
7e60: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
7e70: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
7e80: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
7e90: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
7ea0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
7eb0: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
7ec0: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
7ed0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
7ee0: 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e    zOriginDb = pN
7ef0: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
7f00: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
7f10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7f20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7f30: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
7f40: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
7f50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
7f60: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
7f70: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
7f80: 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  s a sub-select. 
7f90: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
7fa0: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a  ration type and.
7fb0: 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20        ** origin 
7fc0: 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e  info for the sin
7fd0: 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  gle column in th
7fe0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
7ff0: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20  the SELECT.     
8000: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20   ** statement.. 
8010: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61       */.      Na
8020: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
8030: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
8040: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
8050: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20  ;.      Expr *p 
8060: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
8070: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
8080: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
8090: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73  S->pSrc;.      s
80a0: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
80b0: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
80c0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
80d0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
80e0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
80f0: 2c 20 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a  , &zOriginDb, &z
8100: 4f 72 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69  OriginTab, &zOri
8110: 67 69 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20  ginCol); .      
8120: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
8130: 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28  dif.  }.  .  if(
8140: 20 70 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a 20   pzOriginDb ){. 
8150: 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69     assert( pzOri
8160: 67 69 6e 54 61 62 20 26 26 20 70 7a 4f 72 69 67  ginTab && pzOrig
8170: 69 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  inCol );.    *pz
8180: 4f 72 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69 67  OriginDb = zOrig
8190: 69 6e 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  inDb;.    *pzOri
81a0: 67 69 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69 6e  ginTab = zOrigin
81b0: 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  Tab;.    *pzOrig
81c0: 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e 43  inCol = zOriginC
81d0: 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ol;.  }.  return
81e0: 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zType;.}../*.**
81f0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
8200: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
8210: 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61  e VDBE the decla
8220: 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20  ration types of 
8230: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
8240: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f  e result set..*/
8250: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
8260: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
8270: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8280: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
8290: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
82a0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
82b0: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
82c0: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
82d0: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
82e0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
82f0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
8300: 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64   set */.){.#ifnd
8310: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
8320: 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a  ECLTYPE.  Vdbe *
8330: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
8340: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  e;.  int i;.  Na
8350: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
8360: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
8370: 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e  pTabList;.  sNC.
8380: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
8390: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
83a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
83b0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
83c0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
83d0: 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  xpr;.    const c
83e0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64  har *zType;.#ifd
83f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
8400: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
8410: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
8420: 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20  *zOrigDb = 0;.  
8430: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
8440: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  rigTab = 0;.    
8450: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
8460: 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54  gCol = 0;.    zT
8470: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
8480: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
8490: 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26  Db, &zOrigTab, &
84a0: 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20  zOrigCol);..    
84b0: 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74  /* The vdbe must
84c0: 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f   make its own co
84d0: 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  py of the column
84e0: 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20  -type and other 
84f0: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73  .    ** column s
8500: 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c  pecific strings,
8510: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68   in case the sch
8520: 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66  ema is reset bef
8530: 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ore this.    ** 
8540: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
8550: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  is deleted..    
8560: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
8570: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8580: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42  i, COLNAME_DATAB
8590: 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51  ASE, zOrigDb, SQ
85a0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
85b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
85c0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
85d0: 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20   COLNAME_TABLE, 
85e0: 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45  zOrigTab, SQLITE
85f0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
8600: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8610: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8620: 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72  NAME_COLUMN, zOr
8630: 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52  igCol, SQLITE_TR
8640: 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a  ANSIENT);.#else.
8650: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
8660: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
8670: 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
8680: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8690: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
86a0: 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50   COLNAME_DECLTYP
86b0: 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45  E, zType, SQLITE
86c0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
86d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
86e0: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 20  E_OMIT_DECLTYPE 
86f0: 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  */.}../*.** Gene
8700: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
8710: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
8720: 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  E the names of c
8730: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
8740: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68   result set.  Th
8750: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
8760: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64  s used to provid
8770: 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d  e the.** azCol[]
8780: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63   values in the c
8790: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  allback..*/.stat
87a0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
87b0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
87c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
87d0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
87e0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
87f0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
8800: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
8810: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
8820: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
8830: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
8840: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
8850: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
8860: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
8870: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  .  int i, j;.  s
8880: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
8890: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66  rse->db;.  int f
88a0: 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e  ullNames, shortN
88b0: 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ames;..#ifndef S
88c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
88d0: 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  IN.  /* If this 
88e0: 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73  is an EXPLAIN, s
88f0: 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f  kip this step */
8900: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
8910: 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65  xplain ){.    re
8920: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
8930: 0a 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ..  assert( v!=0
8940: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
8950: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c  ->colNamesSet ||
8960: 20 76 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   v==0 || db->mal
8970: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
8980: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
8990: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
89a0: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
89b0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
89c0: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
89d0: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
89e0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
89f0: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
8a00: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
8a10: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
8a20: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
8a30: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
8a40: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
8a50: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
8a60: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
8a70: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
8a80: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f     if( p==0 ) co
8a90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
8aa0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8ab0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  me ){.      char
8ac0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   *zName = pEList
8ad0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
8ae0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8af0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8b00: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
8b10: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  ame, SQLITE_TRAN
8b20: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
8b30: 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b  e if( (p->op==TK
8b40: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70  _COLUMN || p->op
8b50: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29  ==TK_AGG_COLUMN)
8b60: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
8b70: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
8b80: 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  b;.      char *z
8b90: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
8ba0: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
8bb0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
8bc0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
8bd0: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
8be0: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e  [j].iCursor!=p->
8bf0: 69 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20  iTable; j++){}. 
8c00: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
8c10: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b  TabList->nSrc );
8c20: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54  .      pTab = pT
8c30: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
8c40: 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  b;.      if( iCo
8c50: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
8c60: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
8c70: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
8c80: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
8c90: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
8ca0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
8cb0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
8cc0: 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  zCol = "rowid";.
8cd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8ce0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62       zCol = pTab
8cf0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
8d00: 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
8d10: 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65    if( !shortName
8d20: 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20  s && !fullNames 
8d30: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8d40: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8d50: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
8d60: 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  AME, .          
8d70: 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44    sqlite3DbStrND
8d80: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d  up(db, (char*)p-
8d90: 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e  >span.z, p->span
8da0: 2e 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  .n), SQLITE_DYNA
8db0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
8dc0: 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20  e if( fullNames 
8dd0: 7c 7c 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20  || (!shortNames 
8de0: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  && pTabList->nSr
8df0: 63 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  c>1) ){.        
8e00: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
8e10: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
8e20: 54 61 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a  Tab;. .        z
8e30: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
8e40: 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20  a[j].zAlias;.   
8e50: 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d       if( fullNam
8e60: 65 73 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20  es || zTab==0 ) 
8e70: 7a 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTab = pTab->zNa
8e80: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  me;.        zNam
8e90: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
8ea0: 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
8eb0: 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  zTab, zCol);.   
8ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8ed0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8ee0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
8ef0: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e  Name, SQLITE_DYN
8f00: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
8f10: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8f20: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8f30: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8f40: 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49  NAME, zCol, SQLI
8f50: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
8f60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8f70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8f80: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8f90: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8fa0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
8fb0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
8fc0: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e  , (char*)p->span
8fd0: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 2c 20  .z, p->span.n), 
8fe0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
8ff0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
9000: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
9010: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
9020: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23  t, pEList);.}..#
9030: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9040: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
9050: 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  CT./*.** Name of
9060: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9070: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
9080: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
9090: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
90a0: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
90b0: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
90c0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
90d0: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
90e0: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
90f0: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
9100: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
9110: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
9120: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
9130: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
9140: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
9150: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
9160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9170: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
9180: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
9190: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
91a0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
91b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
91c0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
91d0: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
91e0: 47 69 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65  Given a an expre
91f0: 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
9200: 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
9210: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
9220: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
9230: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
9240: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
9250: 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
9260: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
9270: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
9280: 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
9290: 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
92a0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
92b0: 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
92c0: 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
92d0: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
92e0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
92f0: 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
9300: 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
9310: 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
9320: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
9330: 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
9340: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
9350: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
9360: 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
9370: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
9380: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
9390: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
93a0: 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
93b0: 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
93c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
93d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
93e0: 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
93f0: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
9400: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
9410: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
9420: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
9430: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
9440: 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
9450: 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
9460: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
9470: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c  */.  int *pnCol,
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9490: 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
94a0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
94b0: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
94c0: 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
94d0: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
94e0: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
94f0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
9500: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9510: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
9520: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
9530: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
9540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9550: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
9560: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9580: 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
9590: 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
95a0: 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
95b0: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
95c0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
95d0: 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
95e0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
95f0: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
9600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9610: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
9620: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
9630: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20   */.  Expr *p;  
9640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9650: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
9660: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73  for a single res
9670: 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
9680: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
9690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
96a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
96b0: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
96d0: 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a  ize of name in z
96e0: 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 2a 70 6e  Name[] */..  *pn
96f0: 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 70 45 4c  Col = nCol = pEL
9700: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 43  ist->nExpr;.  aC
9710: 6f 6c 20 3d 20 2a 70 61 43 6f 6c 20 3d 20 73 71  ol = *paCol = sq
9720: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
9730: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
9740: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 69  l[0])*nCol);.  i
9750: 66 28 20 61 43 6f 6c 3d 3d 30 20 29 20 72 65 74  f( aCol==0 ) ret
9760: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9770: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
9780: 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  l=aCol; i<nCol; 
9790: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
97a0: 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72    /* Get an appr
97b0: 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72  opriate name for
97c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   the column.    
97d0: 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  */.    p = pELis
97e0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
97f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
9800: 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  ight==0 || p->pR
9810: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ight->token.z==0
9820: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74   || p->pRight->t
9830: 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  oken.z[0]!=0 );.
9840: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
9850: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
9860: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
9870: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
9880: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
9890: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
98a0: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
98b0: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
98c0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
98d0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e  3DbStrDup(db, zN
98e0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
98f0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
9900: 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54  lExpr = p;  /* T
9910: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
9920: 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  at is the result
9930: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   column name */.
9940: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
9950: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  b;         /* Ta
9960: 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
9970: 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73  ith this express
9980: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ion */.      whi
9990: 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  le( pColExpr->op
99a0: 3d 3d 54 4b 5f 44 4f 54 20 29 20 70 43 6f 6c 45  ==TK_DOT ) pColE
99b0: 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  xpr = pColExpr->
99c0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
99d0: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
99e0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 28 70 54  TK_COLUMN && (pT
99f0: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
9a00: 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Tab)!=0 ){.     
9a10: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
9a20: 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
9a30: 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
9a40: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
9a50: 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
9a60: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  mn;.        if( 
9a70: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
9a80: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
9a90: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
9aa0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
9ab0: 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "%s",.          
9ac0: 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f         iCol>=0 ?
9ad0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
9ae0: 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64  ].zName : "rowid
9af0: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ");.      }else{
9b00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  .        /* Use 
9b10: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
9b20: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
9b30: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
9b40: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
9b50: 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20    Token *pToken 
9b60: 3d 20 28 70 43 6f 6c 45 78 70 72 2d 3e 73 70 61  = (pColExpr->spa
9b70: 6e 2e 7a 3f 26 70 43 6f 6c 45 78 70 72 2d 3e 73  n.z?&pColExpr->s
9b80: 70 61 6e 3a 26 70 43 6f 6c 45 78 70 72 2d 3e 74  pan:&pColExpr->t
9b90: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7a  oken);.        z
9ba0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
9bb0: 72 69 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20  rintf(db, "%T", 
9bc0: 70 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  pToken);.      }
9bd0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
9be0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9bf0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9c00: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
9c10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9c20: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9c30: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
9c40: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
9c50: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  re the column na
9c60: 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49  me is unique.  I
9c70: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f  f the name is no
9c80: 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a  t unique,.    **
9c90: 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65   append a intege
9ca0: 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
9cb0: 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
9cc0: 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
9cd0: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c      nName = strl
9ce0: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  en(zName);.    f
9cf0: 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b  or(j=cnt=0; j<i;
9d00: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
9d10: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
9d20: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[j].zName, z
9d30: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
9d40: 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61      char *zNewNa
9d50: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  me;.        zNam
9d60: 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20  e[nName] = 0;.  
9d70: 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d        zNewName =
9d80: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
9d90: 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61  db, "%s:%d", zNa
9da0: 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
9db0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9dc0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
9dd0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e        zName = zN
9de0: 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  ewName;.        
9df0: 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  j = -1;.        
9e00: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62  if( zName==0 ) b
9e10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9e20: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
9e30: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d  ame = zName;.  }
9e40: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
9e50: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66  cFailed ){.    f
9e60: 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  or(j=0; j<i; j++
9e70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9e80: 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b  DbFree(db, aCol[
9e90: 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  j].zName);.    }
9ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
9eb0: 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20  ee(db, aCol);.  
9ec0: 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20    *paCol = 0;.  
9ed0: 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20    *pnCol = 0;.  
9ee0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9ef0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74  NOMEM;.  }.  ret
9f00: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9f10: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65  ../*.** Add type
9f20: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
9f30: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20  nformation to a 
9f40: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65  column list base
9f50: 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54  d on.** a SELECT
9f60: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a   statement..** .
9f70: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
9f80: 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61  st presumably ca
9f90: 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f  me from selectCo
9fa0: 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70  lumnNamesFromExp
9fb0: 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20  rList()..** The 
9fc0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20  column list has 
9fd0: 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20  only names, not 
9fe0: 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69  types or collati
9ff0: 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ons.  This.** ro
a000: 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75  utine goes throu
a010: 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20  gh and adds the 
a020: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
a030: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
a040: 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65   routine require
a050: 73 20 74 68 61 74 20 61 6c 6c 20 69 6e 64 65 6e  s that all inden
a060: 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
a070: 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
a080: 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
a090: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
a0a0: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
a0b0: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
a0c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a0d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
a0e0: 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
a0f0: 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20   int nCol,      
a100: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a110: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20   of columns */. 
a120: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20   Column *aCol,  
a130: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
a140: 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53  f columns */.  S
a150: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
a160: 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75       /* SELECT u
a170: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
a180: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
a190: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  tions */.){.  sq
a1a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a1b0: 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f  se->db;.  NameCo
a1c0: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c  ntext sNC;.  Col
a1d0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c  umn *pCol;.  Col
a1e0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
a1f0: 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b  nt i;.  Expr *p;
a200: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
a210: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61  st_item *a;..  a
a220: 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d  ssert( pSelect!=
a230: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
a240: 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
a250: 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29  s & SF_Resolved)
a260: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
a270: 20 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e   nCol==pSelect->
a280: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c  pEList->nExpr ||
a290: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a2a0: 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  d );.  if( db->m
a2b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
a2c0: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26  turn;.  memset(&
a2d0: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
a2e0: 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63  NC));.  sNC.pSrc
a2f0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
a300: 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c  pSrc;.  a = pSel
a310: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a  ect->pEList->a;.
a320: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
a330: 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  aCol; i<nCol; i+
a340: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
a350: 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  p = a[i].pExpr;.
a360: 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20      pCol->zType 
a370: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
a380: 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65  p(db, columnType
a390: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
a3a0: 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  0));.    pCol->a
a3b0: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
a3c0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
a3d0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
a3e0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
a3f0: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
a400: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
a410: 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
a420: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
a430: 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
a440: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  me);.    }.  }.}
a450: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
a460: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
a470: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62  , generate a Tab
a480: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
a490: 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74  t describes.** t
a4a0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
a4b0: 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f   that SELECT..*/
a4c0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52  .Table *sqlite3R
a4d0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
a4e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
a4f0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
a500: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
a510: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a520: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
a530: 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a  nt savedFlags;..
a540: 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64    savedFlags = d
a550: 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e  b->flags;.  db->
a560: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
a570: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20  _FullColNames;. 
a580: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
a590: 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
a5a0: 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  es;.  sqlite3Sel
a5b0: 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
a5c0: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
a5d0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
a5e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68  ) return 0;.  wh
a5f0: 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
a600: 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
a610: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
a620: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20  ;.  db->flags = 
a630: 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54  savedFlags;.  pT
a640: 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
a650: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
a660: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
a670: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
a680: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a690: 0a 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62  .  pTab->db = db
a6a0: 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d  ;.  pTab->nRef =
a6b0: 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
a6c0: 65 20 3d 20 30 3b 0a 20 20 73 65 6c 65 63 74 43  e = 0;.  selectC
a6d0: 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
a6e0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
a6f0: 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  ct->pEList, &pTa
a700: 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
a710: 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41  aCol);.  selectA
a720: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
a730: 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
a740: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
a750: 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 65 63 74  b->aCol, pSelect
a760: 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  );.  pTab->iPKey
a770: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d   = -1;.  if( db-
a780: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
a790: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
a7a0: 74 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a 20  teTable(pTab);. 
a7b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a7c0: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
a7d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
a7e0: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
a7f0: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
a800: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
a810: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
a820: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
a830: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
a840: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
a850: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
a860: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
a870: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
a880: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
a890: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a8a0: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
a8b0: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
a8c0: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
a8d0: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
a8e0: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e  Parse->db);.#ifn
a8f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a900: 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 76 20  TRACE.    if( v 
a910: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a920: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
a930: 5f 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23  _Trace);.    }.#
a940: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
a950: 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn v;.}.../*.** 
a960: 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
a970: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
a980: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
a990: 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
a9a0: 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
a9b0: 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
a9c0: 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20  ns.  pLimit and 
a9d0: 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  pOffset hold the
a9e0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
a9f0: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
aa00: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
aa10: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
aa20: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
aa30: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
aa40: 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
aa50: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
aa60: 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
aa70: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
aa80: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
aa90: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
aaa0: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
aab0: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
aac0: 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
aad0: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
aae0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
aaf0: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
ab00: 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
ab10: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
ab20: 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
ab30: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ab40: 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
ab50: 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61  lues of iLimit a
ab60: 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
ab70: 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
ab80: 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
ab90: 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64  ed by pLimit and
aba0: 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   pOffset.  iLimi
abb0: 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
abc0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
abd0: 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
abe0: 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
abf0: 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c  values.** (usual
ac00: 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79  ly but not alway
ac10: 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63  s -1) prior to c
ac20: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
ac30: 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ine..** Only if 
ac40: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
ac50: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
ac60: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
ac70: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
ac80: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
ac90: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
aca0: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
acb0: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
acc0: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
acd0: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
ace0: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
acf0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
ad00: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
ad10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
ad20: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
ad30: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
ad40: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
ad50: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
ad60: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
ad70: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
ad80: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
ad90: 20 61 64 64 72 31 3b 0a 20 20 69 66 28 20 70 2d   addr1;.  if( p-
ada0: 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >iLimit ) return
adb0: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c  ;..  /* .  ** "L
adc0: 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20  IMIT -1" always 
add0: 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20  shows all rows. 
ade0: 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20   There is some. 
adf0: 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20   ** contraversy 
ae00: 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63  about what the c
ae10: 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
ae20: 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20  should be..  ** 
ae30: 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
ae40: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72  ementation inter
ae50: 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20  prets "LIMIT 0" 
ae60: 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20  to mean.  ** no 
ae70: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rows..  */.  if(
ae80: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
ae90: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c    p->iLimit = iL
aea0: 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  imit = ++pParse-
aeb0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73  >nMem;.    v = s
aec0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
aed0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
aee0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
aef0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
af00: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
af10: 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
af20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
af30: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
af40: 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  Int, iLimit);.  
af50: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
af60: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
af70: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
af80: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
af90: 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c  _IfZero, iLimit,
afa0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20   iBreak);.  }.  
afb0: 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29  if( p->pOffset )
afc0: 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74  {.    p->iOffset
afd0: 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70   = iOffset = ++p
afe0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
aff0: 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
b000: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
b010: 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c  nMem++;   /* All
b020: 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72  ocate an extra r
b030: 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69  egister for limi
b040: 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  t+offset */.    
b050: 7d 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  }.    v = sqlite
b060: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
b070: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
b080: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
b090: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
b0a0: 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c  rse, p->pOffset,
b0b0: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73   iOffset);.    s
b0c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
b0d0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
b0e0: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
b0f0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
b100: 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22  "OFFSET counter"
b110: 29 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20  ));.    addr1 = 
b120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b130: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  1(v, OP_IfPos, i
b140: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c  Offset);.    sql
b150: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b160: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
b170: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73   iOffset);.    s
b180: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
b190: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
b1a0: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
b1b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b1c0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b1d0: 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f  _Add, iLimit, iO
b1e0: 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31  ffset, iOffset+1
b1f0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
b200: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b  ment((v, "LIMIT+
b210: 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20  OFFSET"));.     
b220: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
b230: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
b240: 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b  _IfPos, iLimit);
b250: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b260: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b270: 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66  nteger, -1, iOff
b280: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  set+1);.      sq
b290: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
b2a0: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
b2b0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
b2c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
b2d0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
b2e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
b2f0: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
b300: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
b310: 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  r the iCol-th co
b320: 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72  lumn of.** the r
b330: 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68  esult set for th
b340: 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  e compound-selec
b350: 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e  t statement "p".
b360: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
b370: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  .** the column h
b380: 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  as no default co
b390: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
b3a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
b3b0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
b3c0: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  or the compound 
b3d0: 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20  select is taken 
b3e0: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74  from the.** left
b3f0: 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68  -most term of th
b400: 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61  e select that ha
b410: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
b420: 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
b430: 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69  c CollSeq *multi
b440: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61  SelectCollSeq(Pa
b450: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
b460: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  ect *p, int iCol
b470: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52  ){.  CollSeq *pR
b480: 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  et;.  if( p->pPr
b490: 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ior ){.    pRet 
b4a0: 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
b4b0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
b4c0: 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20  pPrior, iCol);. 
b4d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74   }else{.    pRet
b4e0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
b4f0: 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pRet==0 ){.    p
b500: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
b510: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
b520: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
b530: 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
b540: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
b550: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b560: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
b570: 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f  SELECT */../* Fo
b580: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
b590: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
b5a0: 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
b5b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b5c0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
b5d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
b5e0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
b5f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
b600: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
b610: 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
b620: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
b630: 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
b640: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
b650: 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
b660: 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  );...#ifndef SQL
b670: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
b680: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54  D_SELECT./*.** T
b690: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
b6a0: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
b6b0: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
b6c0: 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74  y form from.** t
b6d0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
b6e0: 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e  ate queries usin
b6f0: 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41  g UNION, UNION A
b700: 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a  LL, EXCEPT, or.*
b710: 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a  * INTERSECT.**.*
b720: 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20  * "p" points to 
b730: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  the right-most o
b740: 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65  f the two querie
b750: 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e  s.  the query on
b760: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20   the.** left is 
b770: 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20  p->pPrior.  The 
b780: 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64  left query could
b790: 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f   also be a compo
b7a0: 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20  und query.** in 
b7b0: 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20  which case this 
b7c0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
b7d0: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
b7e0: 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ly. .**.** The r
b7f0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f  esults of the to
b800: 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f  tal query are to
b810: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
b820: 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a   a destination.*
b830: 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20  * of type eDest 
b840: 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  with parameter i
b850: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  Parm..**.** Exam
b860: 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72  ple 1:  Consider
b870: 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d   a three-way com
b880: 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d  pound SQL statem
b890: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ent..**.**     S
b8a0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
b8b0: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46  UNION SELECT b F
b8c0: 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM t2 UNION SEL
b8d0: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
b8e0: 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65  .** This stateme
b8f0: 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20  nt is parsed up 
b900: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
b910: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  *     SELECT c F
b920: 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c  ROM t3.**      |
b930: 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e  .**      `----->
b940: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
b950: 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t2.**           
b960: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
b970: 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d           `------
b980: 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  >  SELECT a FROM
b990: 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72   t1.**.** The ar
b9a0: 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67  rows in the diag
b9b0: 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73  ram above repres
b9c0: 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70  ent the Select.p
b9d0: 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a  Prior pointer..*
b9e0: 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  * So if this rou
b9f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
ba00: 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74  ith p equal to t
ba10: 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65  he t3 query, the
ba20: 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c  n.** pPrior will
ba30: 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79   be the t2 query
ba40: 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65  .  p->op will be
ba50: 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69   TK_UNION in thi
ba60: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  s case..**.** No
ba70: 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73  tice that becaus
ba80: 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c  e of the way SQL
ba90: 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f  ite parses compo
baa0: 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65  und SELECTs, the
bab0: 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73  .** individual s
bac0: 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72  elects always gr
bad0: 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  oup from left to
bae0: 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
baf0: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
bb00: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
bb10: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
bb20: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
bb30: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
bb40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
bb50: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
bb60: 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
bb70: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
bb80: 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
bb90: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
bba0: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
bbb0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
bbc0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53  QLITE_OK;   /* S
bbd0: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
bbe0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
bbf0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
bc00: 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
bc10: 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
bc20: 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
bc30: 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bc50: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
bc60: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
bc70: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
bc80: 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  ;      /* Altern
bc90: 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69  ative data desti
bca0: 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  nation */.  Sele
bcb0: 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b  ct *pDelete = 0;
bcc0: 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69    /* Chain of si
bcd0: 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20  mple selects to 
bce0: 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69  delete */.  sqli
bcf0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
bd00: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
bd10: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  nnection */..  /
bd20: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
bd30: 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
bd40: 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   or LIMIT clause
bd50: 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
bd60: 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68  s.  Only.  ** th
bd70: 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f  e last (right-mo
bd80: 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68  st) SELECT in th
bd90: 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
bda0: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
bdb0: 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61   LIMIT..  */.  a
bdc0: 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70  ssert( p && p->p
bdd0: 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c  Prior );  /* Cal
bde0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75  ling function gu
bdf0: 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75  arantees this mu
be00: 63 68 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  ch */.  db = pPa
be10: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f  rse->db;.  pPrio
be20: 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
be30: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
be40: 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72  >pRightmost!=pPr
be50: 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ior );.  assert(
be60: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
be70: 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f  ost==p->pRightmo
be80: 73 74 20 29 3b 0a 20 20 64 65 73 74 20 3d 20 2a  st );.  dest = *
be90: 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
bea0: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
beb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
bec0: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44  rMsg(pParse,"ORD
bed0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
bee0: 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
bef0: 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
bf00: 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
bf10: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
bf20: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
bf30: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
bf40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69  ;.  }.  if( pPri
bf50: 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
bf60: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
bf70: 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20  g(pParse,"LIMIT 
bf80: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
bf90: 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
bfa0: 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
bfb0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
bfc0: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
bfd0: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
bfe0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
bff0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
c000: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
c010: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
c020: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c    /* The VDBE al
c030: 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79  ready created by
c040: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
c050: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n */..  /* Creat
c060: 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
c070: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
c080: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
c090: 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65   */.  if( dest.e
c0a0: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
c0b0: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
c0c0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
c0d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c0e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
c0f0: 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69  phemeral, dest.i
c100: 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  Parm, p->pEList-
c110: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73  >nExpr);.    des
c120: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
c130: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ble;.  }..  /* M
c140: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
c150: 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
c160: 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
c170: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
c180: 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
c190: 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
c1a0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
c1b0: 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
c1c0: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
c1d0: 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
c1e0: 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e  >nExpr!=pPrior->
c1f0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
c200: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
c210: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
c220: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
c230: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
c240: 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
c250: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
c260: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
c270: 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
c280: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
c290: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
c2a0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
c2b0: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
c2c0: 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  * Compound SELEC
c2d0: 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20  Ts that have an 
c2e0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
c2f0: 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
c300: 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  rately..  */.  i
c310: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
c320: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
c330: 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
c340: 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
c350: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
c360: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
c370: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
c380: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
c390: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74  nts..  */.  swit
c3a0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
c3b0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
c3c0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
c3d0: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
c3e0: 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  ( !pPrior->pLimi
c3f0: 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  t );.      pPrio
c400: 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r->pLimit = p->p
c410: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
c420: 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  ior->pOffset = p
c430: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
c440: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
c450: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
c460: 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  or, &dest);.    
c470: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
c480: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
c490: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
c4a0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
c4b0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c4c0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
c4d0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
c4e0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  0;.      p->iLim
c4f0: 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69  it = pPrior->iLi
c500: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  mit;.      p->iO
c510: 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e  ffset = pPrior->
c520: 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  iOffset;.      i
c530: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
c540: 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
c550: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c560: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70  (v, OP_IfZero, p
c570: 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->iLimit);.     
c580: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
c590: 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69  v, "Jump ahead i
c5a0: 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  f LIMIT reached"
c5b0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
c5c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
c5d0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
c5e0: 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 44  &dest);.      pD
c5f0: 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
c600: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
c610: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
c620: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
c630: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
c640: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
c650: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64    }.      if( ad
c660: 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dr ){.        sq
c670: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c680: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
c690: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
c6a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c6b0: 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63  TK_EXCEPT:.    c
c6c0: 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a  ase TK_UNION: {.
c6d0: 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54        int unionT
c6e0: 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ab;    /* Cursor
c6f0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
c700: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68  emporary table h
c710: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
c720: 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
c730: 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  0;      /* One o
c740: 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61  f the SRT_ opera
c750: 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74  tions to apply t
c760: 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20  o self */.      
c770: 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
c780: 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
c790: 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
c7a0: 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
c7b0: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
c7c0: 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74  pLimit, *pOffset
c7d0: 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65  ; /* Saved value
c7e0: 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61  s of p->nLimit a
c7f0: 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f  nd p->nOffset */
c800: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
c810: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
c820: 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20  t uniondest;..  
c830: 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52      priorOp = SR
c840: 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69  T_Union;.      i
c850: 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70  f( dest.eDest==p
c860: 72 69 6f 72 4f 70 20 26 26 20 21 70 2d 3e 70 4c  riorOp && !p->pL
c870: 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66  imit && !p->pOff
c880: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  set ){.        /
c890: 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
c8a0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
c8b0: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
c8c0: 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
c8d0: 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
c8e0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c8f0: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65     unionTab = de
c900: 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20  st.iParm;.      
c910: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
c920: 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
c930: 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
c940: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
c950: 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
c960: 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
c970: 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
c980: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c990: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
c9a0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
c9b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c9c0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
c9d0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
c9e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c9f0: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
ca00: 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  al, unionTab, 0)
ca10: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ca20: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
ca30: 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
ca40: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
ca50: 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
ca60: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67  .        p->pRig
ca70: 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73  htmost->selFlags
ca80: 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
ca90: 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73  eral;.        as
caa0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
cab0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
cac0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
cad0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
cae0: 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
caf0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
cb00: 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64  t( !pPrior->pOrd
cb10: 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71  erBy );.      sq
cb20: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
cb30: 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20  nit(&uniondest, 
cb40: 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
cb50: 62 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  b);.      rc = s
cb60: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
cb70: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
cb80: 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
cb90: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
cba0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
cbb0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
cbc0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
cbd0: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
cbe0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
cbf0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
cc00: 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
cc10: 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
cc20: 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
cc30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cc40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
cc50: 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
cc60: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e       op = SRT_Un
cc70: 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ion;.      }.   
cc80: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
cc90: 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
cca0: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
ccb0: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
ccc0: 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
ccd0: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
cce0: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
ccf0: 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
cd00: 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
cd10: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cd20: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
cd30: 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  p, &uniondest);.
cd40: 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66        /* Query f
cd50: 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c  lattening in sql
cd60: 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67  ite3Select() mig
cd70: 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72  ht refill p->pOr
cd80: 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20  derBy..      ** 
cd90: 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74  Be sure to delet
cda0: 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74  e p->pOrderBy, t
cdb0: 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f  herefore, to avo
cdc0: 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  id a memory leak
cdd0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
cde0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
cdf0: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
ce00: 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
ce10: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
ce20: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
ce30: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
ce40: 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
ce50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ce60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
ce70: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
ce80: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
ce90: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
cea0: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
ceb0: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30     p->iLimit = 0
cec0: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
ced0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  et = 0;.      if
cee0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
cef0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
cf00: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
cf10: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
cf20: 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  t the data in th
cf30: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
cf40: 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
cf50: 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74  form.      ** it
cf60: 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
cf70: 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
cf80: 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20    */      .     
cf90: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21   if( dest.eDest!
cfa0: 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f  =priorOp || unio
cfb0: 6e 54 61 62 21 3d 64 65 73 74 2e 69 50 61 72 6d  nTab!=dest.iParm
cfc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
cfd0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
cfe0: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
cff0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
d000: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
d010: 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
d020: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
d030: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
d040: 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
d050: 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
d060: 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
d070: 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
d080: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  r;.          gen
d090: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
d0a0: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
d0b0: 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
d0c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
d0d0: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
d0e0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
d0f0: 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
d100: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d110: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
d120: 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
d130: 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
d140: 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
d150: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d160: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
d170: 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
d180: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  reak);.        i
d190: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
d1a0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
d1b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  );.        selec
d1c0: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
d1d0: 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
d1e0: 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45   unionTab, p->pE
d1f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d210: 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73       0, -1, &des
d220: 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
d230: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d240: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d250: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
d260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d270: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
d280: 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
d290: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
d2a0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
d2b0: 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
d2c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
d2d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d2e0: 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
d2f0: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
d300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d310: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
d320: 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20  NTERSECT: {.    
d330: 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
d340: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
d350: 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
d360: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
d370: 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
d380: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
d390: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
d3a0: 74 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b  t intersectdest;
d3b0: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a  .      int r1;..
d3c0: 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45        /* INTERSE
d3d0: 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  CT is different 
d3e0: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
d3f0: 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65  since it require
d400: 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74  s.      ** two t
d410: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
d420: 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69    Hence it has i
d430: 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65  ts own case.  Be
d440: 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  gin.      ** by 
d450: 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
d460: 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
d470: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
d480: 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
d490: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
d4a0: 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
d4b0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Tab++;.      ass
d4c0: 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
d4d0: 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64  ==0 );..      ad
d4e0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
d4f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
d500: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31  nEphemeral, tab1
d510: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
d520: 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
d530: 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
d540: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
d550: 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
d560: 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74  .      p->pRight
d570: 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  most->selFlags |
d580: 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
d590: 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  al;.      assert
d5a0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a  ( p->pEList );..
d5b0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
d5c0: 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
d5d0: 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
d5e0: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
d5f0: 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
d600: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d610: 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65  estInit(&interse
d620: 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f  ctdest, SRT_Unio
d630: 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20  n, tab1);.      
d640: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
d650: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
d660: 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  r, &intersectdes
d670: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
d680: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
d690: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
d6a0: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
d6b0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
d6c0: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
d6d0: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
d6e0: 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a  e "tab2".      *
d6f0: 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  /.      addr = s
d700: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d710: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
d720: 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a  eral, tab2, 0);.
d730: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d740: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
d750: 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
d760: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
d770: 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  1] = addr;.     
d780: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
d790: 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
d7a0: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
d7b0: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
d7c0: 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
d7d0: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
d7e0: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
d7f0: 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74  .      intersect
d800: 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 74 61 62  dest.iParm = tab
d810: 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  2;.      rc = sq
d820: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
d830: 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63  se, p, &intersec
d840: 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 44  tdest);.      pD
d850: 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
d860: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
d870: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
d880: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
d890: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
d8a0: 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
d8b0: 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
d8c0: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
d8d0: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = pOffset;.     
d8e0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
d8f0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d900: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
d910: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  }..      /* Gene
d920: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
d930: 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
d940: 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
d950: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
d960: 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
d970: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
d980: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
d990: 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
d9a0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
d9b0: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
d9c0: 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
d9d0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
d9e0: 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
d9f0: 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
da00: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65  rior;.        ge
da10: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
da20: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
da30: 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
da40: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65      }.      iBre
da50: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
da60: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
da70: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
da80: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
da90: 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  (v);.      compu
daa0: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
dab0: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
dac0: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
dad0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
dae0: 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
daf0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
db00: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
db10: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
db20: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
db30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
db40: 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74  (v, OP_RowKey, t
db50: 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ab1, r1);.      
db60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
db70: 33 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  3(v, OP_NotFound
db80: 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
db90: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
dba0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
dbb0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
dbc0: 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
dbd0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
dbe0: 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70  >pEList, tab1, p
dbf0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
dc00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dc10: 20 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64         0, -1, &d
dc20: 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
dc30: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
dc40: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
dc50: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
dc60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dc70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
dc80: 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
dc90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dca0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
dcb0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
dcc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dcd0: 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
dce0: 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
dcf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dd00: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
dd10: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ab1, 0);.      b
dd20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
dd30: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
dd40: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
dd50: 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  s used by .  ** 
dd60: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
dd70: 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
dd80: 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
dd90: 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
dda0: 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
ddb0: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
ddc0: 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
ddd0: 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
dde0: 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72  his section is r
ddf0: 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d  un by the right-
de00: 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
de10: 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a  ement only..  **
de20: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
de30: 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  ts to the left a
de40: 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20  lways skip this 
de50: 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74  part.  The right
de60: 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43  -most.  ** SELEC
de70: 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69  T might also ski
de80: 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69  p this part if i
de90: 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42  t has no ORDER B
dea0: 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a  Y clause and.  *
deb0: 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73  * no temp tables
dec0: 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20   are required.. 
ded0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
dee0: 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45  Flags & SF_UsesE
def0: 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
df00: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
df20: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
df30: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
df40: 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
df50: 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
df60: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
df70: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
df80: 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
df90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dfa0: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
dfb0: 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
dfc0: 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
dfd0: 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c   CollSeq **apCol
dfe0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
dff0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
e000: 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e  rough pKeyInfo->
e010: 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69  aColl[] */.    i
e020: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e040: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
e050: 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20  s in result set 
e060: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
e070: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70  p->pRightmost==p
e080: 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   );.    nCol = p
e090: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
e0a0: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
e0b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
e0c0: 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20  ero(db,.        
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
e0e0: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29  izeof(*pKeyInfo)
e0f0: 2b 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f  +nCol*(sizeof(Co
e100: 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20  llSeq*) + 1));. 
e110: 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f     if( !pKeyInfo
e120: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
e130: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e140: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
e150: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
e160: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  .    pKeyInfo->e
e170: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
e180: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65    pKeyInfo->nFie
e190: 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20  ld = nCol;..    
e1a0: 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d  for(i=0, apColl=
e1b0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b  pKeyInfo->aColl;
e1c0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70   i<nCol; i++, ap
e1d0: 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  Coll++){.      *
e1e0: 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65  apColl = multiSe
e1f0: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
e200: 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
e210: 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20   if( 0==*apColl 
e220: 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f  ){.        *apCo
e230: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
e240: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
e250: 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  }..    for(pLoop
e260: 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
e270: 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b  =pLoop->pPrior){
e280: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
e290: 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
e2a0: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c     int addr = pL
e2b0: 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
e2c0: 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  m[i];.        if
e2d0: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
e2e0: 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20        /* If [0] 
e2f0: 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b  is unused then [
e300: 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65  1] is also unuse
e310: 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20  d.  So we can.  
e320: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
e330: 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61  s safely abort a
e340: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69  s soon as the fi
e350: 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20  rst unused slot 
e360: 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  is found */.    
e370: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
e380: 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
e390: 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20  m[1]<0 );.      
e3a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e3b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
e3c0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
e3d0: 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b  (v, addr, nCol);
e3e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e3f0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
e400: 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65  addr, (char*)pKe
e410: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
e420: 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  O);.        pLoo
e430: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
e440: 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  i] = -1;.      }
e450: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e460: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b 65  e3DbFree(db, pKe
e470: 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
e480: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
e490: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 64   pDest->iMem = d
e4a0: 65 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44 65 73  est.iMem;.  pDes
e4b0: 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74 2e 6e  t->nMem = dest.n
e4c0: 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Mem;.  sqlite3Se
e4d0: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
e4e0: 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72  Delete);.  retur
e4f0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
e500: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
e510: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
e520: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
e530: 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
e540: 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e  e for a coroutin
e550: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
e560: 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   of a.** SELECT 
e570: 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  statment..**.** 
e580: 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f  The data to be o
e590: 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e  utput is contain
e5a0: 65 64 20 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d 2e  ed in pIn->iMem.
e5b0: 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70    There are.** p
e5c0: 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e 73  In->nMem columns
e5d0: 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20   to be output.  
e5e0: 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74  pDest is where t
e5f0: 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64  he output should
e600: 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a  .** be sent..**.
e610: 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20  ** regReturn is 
e620: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
e630: 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
e640: 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ng the subroutin
e650: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72  e.** return addr
e660: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  ess..**.** If re
e670: 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20  gPrev>0 then it 
e680: 69 73 20 61 20 74 68 65 20 66 69 72 73 74 20 72  is a the first r
e690: 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63  egister in a vec
e6a0: 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f  tor that.** reco
e6b0: 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  rds the previous
e6c0: 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65   output.  mem[re
e6d0: 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67  gPrev] is a flag
e6e0: 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a   that is false.*
e6f0: 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62  * if there has b
e700: 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20  een no previous 
e710: 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50  output.  If regP
e720: 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20  rev>0 then code 
e730: 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  is.** generated 
e740: 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c  to suppress dupl
e750: 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66  icates.  pKeyInf
e760: 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f  o is used for co
e770: 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e  mparing.** keys.
e780: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49  .**.** If the LI
e790: 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e  MIT found in p->
e7a0: 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65  iLimit is reache
e7b0: 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  d, jump immediat
e7c0: 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b  ely to.** iBreak
e7d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e7e0: 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
e7f0: 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73  broutine(.  Pars
e800: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e810: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
e820: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
e830: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
e840: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
e850: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
e860: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e   SelectDest *pIn
e870: 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f  ,        /* Coro
e880: 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20  utine supplying 
e890: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
e8a0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
e8b0: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65    /* Where to se
e8c0: 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20  nd the data */. 
e8d0: 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20   int regReturn, 
e8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e8f0: 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  return address r
e900: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
e910: 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20   regPrev,       
e920: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
e930: 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
e940: 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73  .  No uniqueness
e950: 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e   if 0 */.  KeyIn
e960: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
e970: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72     /* For compar
e980: 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75  ing with previou
e990: 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  s entry */.  int
e9a0: 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20   p4type,        
e9b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34 20 74       /* The p4 t
e9c0: 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e 66 6f  ype for pKeyInfo
e9d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9f0: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65   Jump here if we
ea00: 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a   hit the LIMIT *
ea10: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
ea20: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
ea30: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b    int iContinue;
ea40: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20  .  int addr;..  
ea50: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
ea60: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
ea70: 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  ;.  iContinue = 
ea80: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
ea90: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53  abel(v);..  /* S
eaa0: 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
eab0: 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58  es for UNION, EX
eac0: 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
ead0: 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ECT .  */.  if( 
eae0: 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69  regPrev ){.    i
eaf0: 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a  nt j1, j2;.    j
eb00: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
eb10: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
eb20: 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  t, regPrev);.   
eb30: 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
eb40: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
eb50: 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  mpare, pIn->iMem
eb60: 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
eb70: 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->nMem,.        
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb90: 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
eba0: 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b 0a  yInfo, p4type);.
ebb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ebc0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
ebd0: 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75  , j2+2, iContinu
ebe0: 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71  e, j2+2);.    sq
ebf0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
ec00: 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71  e(v, j1);.    sq
ec10: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
ec20: 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  y(pParse, pIn->i
ec30: 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  Mem, regPrev+1, 
ec40: 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  pIn->nMem);.    
ec50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ec60: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
ec70: 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
ec80: 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
ec90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
eca0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
ecb0: 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
ecc0: 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
ecd0: 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72   entries if ther
ece0: 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63  e is an OFFSET c
ecf0: 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64  lause.  */.  cod
ed00: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43  eOffset(v, p, iC
ed10: 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69  ontinue);..  swi
ed20: 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
ed30: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
ed40: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
ed50: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
ed60: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
ed70: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
ed80: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
ed90: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
eda0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
edb0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
edc0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
edd0: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
ede0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
edf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ee00: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
ee10: 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
ee20: 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c  iMem, pIn->nMem,
ee30: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
ee40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ee50: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44   OP_NewRowid, pD
ee60: 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 32 29 3b  est->iParm, r2);
ee70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ee80: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
ee90: 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50  nsert, pDest->iP
eea0: 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
eeb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
eec0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
eed0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
eee0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
eef0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
ef00: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
ef10: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
ef20: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
ef30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ef40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ef50: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
ef60: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
ef70: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
ef80: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
ef90: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
efa0: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
efb0: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
efc0: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
efd0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
efe0: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
eff0: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
f000: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
f010: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
f020: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
f030: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
f040: 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r1;.      assert
f050: 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29  ( pIn->nMem==1 )
f060: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e  ;.      p->affin
f070: 69 74 79 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ity = .         
f080: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
f090: 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74  finity(p->pEList
f0a0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
f0b0: 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a  est->affinity);.
f0c0: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
f0d0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
f0e0: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
f0f0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
f100: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
f110: 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72 31  pIn->iMem, 1, r1
f120: 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20  , &p->affinity, 
f130: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
f140: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
f150: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
f160: 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a   pIn->iMem, 1);.
f170: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f180: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
f190: 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  xInsert, pDest->
f1a0: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
f1b0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
f1c0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
f1d0: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
f1e0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20  ;.    }..#if 0  
f1f0: 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20  /* Never occurs 
f200: 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71  on an ORDER BY q
f210: 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  uery */.    /* I
f220: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
f230: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
f240: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
f250: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
f260: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
f270: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
f280: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f290: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
f2a0: 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 50  er, 1, pDest->iP
f2b0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  arm);.      /* T
f2c0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
f2d0: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
f2e0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
f2f0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
f300: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
f310: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
f320: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
f330: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
f340: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
f350: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
f360: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
f370: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
f380: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
f390: 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
f3a0: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
f3b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
f3c0: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
f3d0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
f3e0: 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nMem==1 );.     
f3f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f400: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
f410: 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69  ->iMem, pDest->i
f420: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
f430: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
f440: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
f450: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
f460: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
f470: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
f480: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
f490: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
f4a0: 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65  Y */..    /* The
f4b0: 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
f4c0: 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
f4d0: 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  e of registers. 
f4e0: 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
f4f0: 74 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2e 20 20  t pDest->iMem.  
f500: 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74  Then the co-rout
f510: 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20  ine yields..    
f520: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
f530: 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  Coroutine: {.   
f540: 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d     if( pDest->iM
f550: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  em==0 ){.       
f560: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73   pDest->iMem = s
f570: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
f580: 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
f590: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70  nMem);.        p
f5a0: 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e  Dest->nMem = pIn
f5b0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->nMem;.      }.
f5c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f5d0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
f5e0: 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65  , pIn->iMem, pDe
f5f0: 73 74 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d  st->iMem, pDest-
f600: 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71  >nMem);.      sq
f610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
f620: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
f630: 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20  st->iParm);.    
f640: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
f650: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 61      /* Results a
f660: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
f670: 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
f680: 74 65 72 73 2e 20 20 54 68 65 6e 20 74 68 65 0a  ters.  Then the.
f690: 20 20 20 20 2a 2a 20 4f 50 5f 52 65 73 75 6c 74      ** OP_Result
f6a0: 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73  Row opcode is us
f6b0: 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69  ed to cause sqli
f6c0: 74 65 33 5f 73 74 65 70 28 29 20 74 6f 20 72 65  te3_step() to re
f6d0: 74 75 72 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  turn.    ** the 
f6e0: 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75  next row of resu
f6f0: 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  lt..    */.    c
f700: 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20  ase SRT_Output: 
f710: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
f720: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f730: 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e  ResultRow, pIn->
f740: 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29  iMem, pIn->nMem)
f750: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
f760: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
f770: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
f780: 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e  In->iMem, pIn->n
f790: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Mem);.      brea
f7a0: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  k;.    }..#if !d
f7b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f7c0: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
f7d0: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
f7e0: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
f7f0: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
f800: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
f810: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
f820: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
f830: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
f840: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
f850: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
f860: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
f870: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
f880: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
f890: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
f8a0: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
f8b0: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
f8c0: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
f8d0: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
f8e0: 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  : {.      break;
f8f0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
f900: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
f910: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
f920: 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
f930: 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
f940: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
f950: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
f960: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f970: 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d  _AddImm, p->iLim
f980: 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c  it, -1);.    sql
f990: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f9a0: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e  , OP_IfZero, p->
f9b0: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
f9c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
f9d0: 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69  ate the subrouti
f9e0: 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  ne return.  */. 
f9f0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
fa00: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
fa10: 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
fa20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
fa30: 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74  P_Return, regRet
fa40: 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  urn);..  return 
fa50: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
fa60: 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f  lternative compo
fa70: 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20  und select code 
fa80: 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61  generator for ca
fa90: 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a  ses when there.*
faa0: 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  * is an ORDER BY
fab0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57   clause..**.** W
fac0: 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79  e assume a query
fad0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
fae0: 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  g form:.**.**   
faf0: 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f     <selectA>  <o
fb00: 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63  perator>  <selec
fb10: 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f  tB>  ORDER BY <o
fb20: 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a  rderbylist>.**.*
fb30: 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
fb40: 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c  one of UNION ALL
fb50: 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  , UNION, EXCEPT,
fb60: 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20   or INTERSECT.  
fb70: 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74  The idea.** is t
fb80: 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c  o code both <sel
fb90: 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63  ectA> and <selec
fba0: 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44  tB> with the ORD
fbb0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a  ER BY clause as.
fbc0: 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20  ** co-routines. 
fbd0: 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f   Then run the co
fbe0: 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72  -routines in par
fbf0: 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20  allel and merge 
fc00: 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
fc10: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20  nto the output. 
fc20: 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
fc30: 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
fc40: 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63  es (called selec
fc50: 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  tA and.** select
fc60: 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73  B) there are 7 s
fc70: 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a  ubroutines:.**.*
fc80: 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f  *    outA:    Mo
fc90: 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
fca0: 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72   the selectA cor
fcb0: 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
fcc0: 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
fcd0: 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
fce0: 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a  pound query..**.
fcf0: 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d  **    outB:    M
fd00: 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
fd10: 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f  f the selectB co
fd20: 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
fd30: 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
fd40: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
fd50: 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28  mpound query.  (
fd60: 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66  Only generated f
fd70: 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20  or UNION and.** 
fd80: 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
fd90: 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61  N ALL.  EXCEPT a
fda0: 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65  nd INSERTSECT ne
fdb0: 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77  ver output a row
fdc0: 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
fdd0: 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c       appears onl
fde0: 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20  y in B.).**.**  
fdf0: 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65    AltB:    Calle
fe00: 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
fe10: 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
fe20: 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c  oroutines and A<
fe30: 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42  B..**.**    AeqB
fe40: 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
fe50: 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
fe60: 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
fe70: 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a  nes and A==B..**
fe80: 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20  .**    AgtB:    
fe90: 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
fea0: 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
feb0: 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
fec0: 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A>B..**.**   
fed0: 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64   EofA:    Called
fee0: 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
fef0: 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
ff00: 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45  ectA..**.**    E
ff10: 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofB:    Called w
ff20: 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
ff30: 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
ff40: 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  tB..**.** The im
ff50: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
ff60: 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20  the latter five 
ff70: 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65  subroutines depe
ff80: 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20  nd on which .** 
ff90: 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73  <operator> is us
ffa0: 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed:.**.**.**    
ffb0: 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
ffc0: 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e  LL         UNION
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45              EXCE
ffe0: 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45  PT          INTE
fff0: 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  RSECT.**        
10000 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20    ------------- 
10010 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
10020 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
10030 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
10040 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a  -----.**   AltB:
10050 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
10060 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
10070 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
10080 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a  A         nextA.
10090 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20  **.**   AeqB:   
100a0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
100b0 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
100c0 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
100d0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a      outA, nextA.
100e0 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20  **.**   AgtB:   
100f0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
10100 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
10110 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20        nextB     
10120 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a         nextB.**.
10130 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74  **   EofA:   out
10140 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
10150 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
10160 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20     halt         
10170 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20      halt.**.**  
10180 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e   EofB:   outA, n
10190 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
101a0 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
101b0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
101c0 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  halt.**.** In th
101d0 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e  e AltB, AeqB, an
101e0 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e  d AgtB subroutin
101f0 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20  es, an EOF on A 
10200 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a  following nextA.
10210 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d  ** causes an imm
10220 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
10230 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f  ofA and an EOF o
10240 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n B following ne
10250 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e  xtB causes.** an
10260 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
10270 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e  to EofB.  Within
10280 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20   EofA and EofB, 
10290 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79  and EOF on entry
102a0 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   or.** following
102b0 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20   nextX causes a 
102c0 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  jump to the end 
102d0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72  of the select pr
102e0 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
102f0 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  Duplicate remova
10300 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20  l in the UNION, 
10310 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
10320 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68  RSECT cases is h
10330 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e  andled.** within
10340 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
10350 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67  outine.  The reg
10360 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65  Prev register se
10370 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76  t holds the prev
10380 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74  iously.** output
10390 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61   value.  A compa
103a0 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67  rison is made ag
103b0 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65  ainst this value
103c0 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
103d0 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ** is skipped if
103e0 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74   the next result
103f0 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73  s would be the s
10400 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69  ame as the previ
10410 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ous..**.** The i
10420 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c  mplementation pl
10430 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65  an is to impleme
10440 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  nt the two corou
10450 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a  tines and seven.
10460 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66  ** subroutines f
10470 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74  irst, then put t
10480 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63  he control logic
10490 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20   at the bottom. 
104a0 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
104b0 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  *          goto 
104c0 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a  Init.**     coA:
104d0 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
104e0 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a  eft query (A).**
104f0 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74       coB: corout
10500 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75  ine for right qu
10510 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75  ery (B).**    ou
10520 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tA: output one r
10530 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75  ow of A.**    ou
10540 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tB: output one r
10550 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61  ow of B (UNION a
10560 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c  nd UNION ALL onl
10570 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e  y).**    EofA: .
10580 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e  ...**    EofB: .
10590 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e  ...**    AltB: .
105a0 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e  ...**    AeqB: .
105b0 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e  ...**    AgtB: .
105c0 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69  ...**    Init: i
105d0 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74  nitialize corout
105e0 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  ine registers.**
105f0 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
10600 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coA.**          
10610 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45  if eof(A) goto E
10620 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ofA.**          
10630 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20  yield coB.**    
10640 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20        if eof(B) 
10650 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20  goto EofB.**    
10660 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c  Cmpr: Compare A,
10670 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a   B.**          J
10680 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  ump AltB, AeqB, 
10690 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a  AgtB.**     End:
106a0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61   ....**.** We ca
106b0 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  ll AltB, AeqB, A
106c0 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45  gtB, EofA, and E
106d0 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73  ofB "subroutines
106e0 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e  " but they are n
106f0 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63  ot.** actually c
10700 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75  alled using Gosu
10710 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f  b and they do no
10720 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20  t Return.  EofA 
10730 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a  and EofB loop.**
10740 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20   until all data 
10750 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65  is exhausted the
10760 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65  n jump to the "e
10770 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c  nd" labe.  AltB,
10780 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67   AeqB,.** and Ag
10790 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65  tB jump to eithe
107a0 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f  r L2 or to one o
107b0 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a  f EofA or EofB..
107c0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
107d0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
107e0 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e  SELECT.static in
107f0 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
10800 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
10810 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
10820 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
10830 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
10840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10850 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
10860 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
10870 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
10880 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
10890 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
108a0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
108b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
108c0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
108d0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
108e0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
108f0 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
10900 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
10910 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
10920 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
10930 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
10940 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
10950 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
10960 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
10970 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stA;     /* Dest
10980 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
10990 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c  utine A */.  Sel
109a0 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20  ectDest destB;  
109b0 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
109c0 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
109d0 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  B */.  int regAd
109e0 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drA;         /* 
109f0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
10a00 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f   for select-A co
10a10 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10a20 20 72 65 67 45 6f 66 41 3b 20 20 20 20 20 20 20   regEofA;       
10a30 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e     /* Flag to in
10a40 64 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65  dicate when sele
10a50 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65 74 65  ct-A is complete
10a60 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
10a70 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rB;         /* A
10a80 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
10a90 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  for select-B cor
10aa0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10ab0 72 65 67 45 6f 66 42 3b 20 20 20 20 20 20 20 20  regEofB;        
10ac0 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64    /* Flag to ind
10ad0 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63  icate when selec
10ae0 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74 65 20  t-B is complete 
10af0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
10b00 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectA;      /* Ad
10b10 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
10b20 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
10b30 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
10b40 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectB;      /* Ad
10b50 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
10b60 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
10b70 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41  */.  int regOutA
10b80 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
10b90 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
10ba0 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  or the output-A 
10bb0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
10bc0 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20  int regOutB;    
10bd0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10be0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
10bf0 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
10c00 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
10c10 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20  ddrOutA;        
10c20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
10c30 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
10c40 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10c50 61 64 64 72 4f 75 74 42 3b 20 20 20 20 20 20 20  addrOutB;       
10c60 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10c70 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
10c80 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10c90 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20   addrEofA;      
10ca0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
10cb0 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78   the select-A-ex
10cc0 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
10cd0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
10ce0 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofB;         /*
10cf0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
10d00 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74  select-B-exhaust
10d10 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
10d20 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b  .  int addrAltB;
10d30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10d40 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73  ess of the A<B s
10d50 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
10d60 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20  nt addrAeqB;    
10d70 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10d80 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72  of the A==B subr
10d90 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10da0 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20  addrAgtB;       
10db0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10dc0 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69  the A>B subrouti
10dd0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ne */.  int regL
10de0 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a  imitA;        /*
10df0 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
10e00 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
10e10 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b    int regLimitB;
10e20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
10e30 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
10e40 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
10e50 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
10e60 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20    /* A range of 
10e70 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
10e80 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  d previous outpu
10e90 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
10ea0 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
10eb0 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
10ec0 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e  ->iLimit */.  in
10ed0 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20  t savedOffset;  
10ee0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
10ef0 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74  ue of p->iOffset
10f00 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43   */.  int labelC
10f10 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  mpr;        /* L
10f20 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61  abel for the sta
10f30 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20  rt of the merge 
10f40 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69  algorithm */.  i
10f50 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20  nt labelEnd;    
10f60 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
10f70 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
10f80 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20   overall SELECT 
10f90 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31  stmt */.  int j1
10fa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10fb0 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74  /* Jump instruct
10fc0 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65  ions that get re
10fd0 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69  targetted */.  i
10fe0 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
10ff0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
11000 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c  K_ALL, TK_UNION,
11010 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49   TK_EXCEPT, TK_I
11020 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65  NTERSECT */.  Ke
11030 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d  yInfo *pKeyDup =
11040 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f   0; /* Compariso
11050 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
11060 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  r duplicate remo
11070 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  val */.  KeyInfo
11080 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f   *pKeyMerge;   /
11090 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
110a0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72  ormation for mer
110b0 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73  ging rows */.  s
110c0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
110d0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
110e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
110f0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
11100 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
11110 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
11120 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
11130 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11140 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
11150 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11160 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  se */.  int *aPe
11170 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  rmute;        /*
11180 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52   Mapping from OR
11190 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
111a0 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
111b0 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ns */..  assert(
111c0 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20   p->pOrderBy!=0 
111d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
111e0 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d  yDup==0 ); /* "M
111f0 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65  anaged" code nee
11200 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74  ds this.  Ticket
11210 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20   #3382. */.  db 
11220 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11230 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
11240 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  e;.  if( v==0 ) 
11250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
11260 4d 45 4d 3b 0a 20 20 6c 61 62 65 6c 45 6e 64 20  MEM;.  labelEnd 
11270 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
11280 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
11290 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
112a0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
112b0 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
112c0 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
112d0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
112e0 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
112f0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
11300 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
11310 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
11320 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
11330 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
11340 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
11350 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
11360 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
11370 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
11380 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
11390 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
113a0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
113b0 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
113c0 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
113d0 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
113e0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
113f0 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
11400 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
11410 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
11420 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
11430 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
11440 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
11450 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
11460 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
11470 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11480 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
11490 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
114a0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
114b0 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
114c0 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
114d0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
114e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
114f0 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 29 3b 0a 20  tem->iCol>0 );. 
11500 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
11510 2d 3e 69 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61  ->iCol==i ) brea
11520 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
11530 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79   if( j==nOrderBy
11540 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
11550 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
11560 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
11570 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20  _INTEGER, 0, 0, 
11580 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
11590 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
115a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
115b0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61         pNew->fla
115c0 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75  gs |= EP_IntValu
115d0 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e;.        pNew-
115e0 3e 69 54 61 62 6c 65 20 3d 20 69 3b 0a 20 20 20  >iTable = i;.   
115f0 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
11600 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
11610 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f  ppend(pParse, pO
11620 72 64 65 72 42 79 2c 20 70 4e 65 77 2c 20 30 29  rderBy, pNew, 0)
11630 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
11640 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b  By->a[nOrderBy++
11650 5d 2e 69 43 6f 6c 20 3d 20 69 3b 0a 20 20 20 20  ].iCol = i;.    
11660 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
11670 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
11680 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75  comparison permu
11690 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e  tation and keyin
116a0 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20  fo that is used 
116b0 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65  with.  ** the pe
116c0 72 6d 75 74 61 74 69 6f 6e 20 69 6e 20 6f 72 64  rmutation in ord
116d0 65 72 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  er to comparison
116e0 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  s to determine i
116f0 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20  f the next.  ** 
11700 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63  row of results c
11710 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  omes from select
11720 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41  A or selectB.  A
11730 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74  lso add explicit
11740 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73  .  ** collations
11750 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
11760 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f   clause terms so
11770 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73   that when the s
11780 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74  ubqueries.  ** t
11790 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20  o the right and 
117a0 74 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61  the left are eva
117b0 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65  luated, they use
117c0 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a   the correct.  *
117d0 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a  * collation..  *
117e0 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73  /.  aPermute = s
117f0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
11800 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  w(db, sizeof(int
11810 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69  )*nOrderBy);.  i
11820 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20  f( aPermute ){. 
11830 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
11840 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
11850 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
11860 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
11870 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c  i<nOrderBy; i++,
11880 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
11890 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
118a0 69 43 6f 6c 3e 30 20 20 26 26 20 70 49 74 65 6d  iCol>0  && pItem
118b0 2d 3e 69 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73  ->iCol<=p->pELis
118c0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
118d0 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20    aPermute[i] = 
118e0 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 2d 20 31 3b  pItem->iCol - 1;
118f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
11900 65 72 67 65 20 3d 0a 20 20 20 20 20 20 73 71 6c  erge =.      sql
11910 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
11920 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79  db, sizeof(*pKey
11930 4d 65 72 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a  Merge)+nOrderBy*
11940 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
11950 29 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70  )+1));.    if( p
11960 4b 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  KeyMerge ){.    
11970 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f    pKeyMerge->aSo
11980 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
11990 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c  pKeyMerge->aColl
119a0 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20  [nOrderBy];.    
119b0 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69    pKeyMerge->nFi
119c0 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  eld = nOrderBy;.
119d0 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
119e0 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  >enc = ENC(db);.
119f0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
11a00 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
11a10 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
11a20 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
11a30 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
11a40 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
11a50 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
11a60 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20   pTerm->flags & 
11a70 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b  EP_ExpCollate ){
11a80 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
11a90 20 3d 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 3b   = pTerm->pColl;
11aa0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
11ab0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
11ac0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
11ad0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
11ae0 61 50 65 72 6d 75 74 65 5b 69 5d 29 3b 0a 20 20  aPermute[i]);.  
11af0 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66          pTerm->f
11b00 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f  lags |= EP_ExpCo
11b10 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 20  llate;.         
11b20 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 20 3d 20   pTerm->pColl = 
11b30 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  pColl;.        }
11b40 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72  .        pKeyMer
11b50 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  ge->aColl[i] = p
11b60 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b  Coll;.        pK
11b70 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72  eyMerge->aSortOr
11b80 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42  der[i] = pOrderB
11b90 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
11ba0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
11bb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
11bc0 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d  eyMerge = 0;.  }
11bd0 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20  ..  /* Reattach 
11be0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
11bf0 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79  use to the query
11c00 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ..  */.  p->pOrd
11c10 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
11c20 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  .  pPrior->pOrde
11c30 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
11c40 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d  rListDup(pParse-
11c50 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  >db, pOrderBy);.
11c60 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
11c70 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
11c80 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
11c90 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
11ca0 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
11cb0 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
11cc0 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
11cd0 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
11ce0 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
11cf0 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
11d00 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
11d10 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
11d20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
11d30 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
11d40 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
11d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
11d60 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
11d70 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
11d80 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
11d90 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  =nExpr || db->ma
11da0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
11db0 20 20 72 65 67 50 72 65 76 20 3d 20 73 71 6c 69    regPrev = sqli
11dc0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
11dd0 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 31 29  pParse, nExpr+1)
11de0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11df0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
11e00 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65  teger, 0, regPre
11e10 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20  v);.    pKeyDup 
11e20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
11e30 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20  cZero(db,.      
11e40 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
11e50 6f 66 28 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e  of(*pKeyDup) + n
11e60 45 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  Expr*(sizeof(Col
11e70 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20  lSeq*)+1) );.   
11e80 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a   if( pKeyDup ){.
11e90 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
11ea0 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
11eb0 29 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c  )&pKeyDup->aColl
11ec0 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70  [nExpr];.      p
11ed0 4b 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d  KeyDup->nField =
11ee0 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4b   nExpr;.      pK
11ef0 65 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45 4e 43  eyDup->enc = ENC
11f00 28 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  (db);.      for(
11f10 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
11f20 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  +){.        pKey
11f30 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Dup->aColl[i] = 
11f40 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
11f50 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
11f60 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  ;.        pKeyDu
11f70 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  p->aSortOrder[i]
11f80 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
11f90 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53    }.  }. .  /* S
11fa0 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74  eparate the left
11fb0 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71   and the right q
11fc0 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e  uery from one an
11fd0 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e  other.  */.  p->
11fe0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50  pPrior = 0;.  pP
11ff0 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
12000 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52   = 0;.  sqlite3R
12010 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
12020 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  By(pParse, p, p-
12030 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
12040 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  R");.  if( pPrio
12050 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  r->pPrior==0 ){.
12060 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
12070 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
12080 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70  Parse, pPrior, p
12090 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c  Prior->pOrderBy,
120a0 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a   "ORDER");.  }..
120b0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
120c0 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73   limit registers
120d0 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
120e0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
120f0 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29  se, p, labelEnd)
12100 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
12110 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  t && op==TK_ALL 
12120 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  ){.    regLimitA
12130 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
12140 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42  m;.    regLimitB
12150 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
12160 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
12170 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
12180 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20  opy, p->iOffset 
12190 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a  ? p->iOffset+1 :
121a0 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20   p->iLimit,.    
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
121d0 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71  gLimitA);.    sq
121e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
121f0 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c  v, OP_Copy, regL
12200 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42  imitA, regLimitB
12210 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12220 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c  regLimitA = regL
12230 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20  imitB = 0;.  }. 
12240 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
12250 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
12260 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  );.  p->pLimit =
12270 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
12280 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
12290 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f  Offset);.  p->pO
122a0 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65  ffset = 0;..  re
122b0 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73  gAddrA = ++pPars
122c0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f  e->nMem;.  regEo
122d0 66 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  fA = ++pParse->n
122e0 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20  Mem;.  regAddrB 
122f0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
12300 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d 20 2b 2b  ;.  regEofB = ++
12310 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12320 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72  regOutA = ++pPar
12330 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
12340 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utB = ++pParse->
12350 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
12360 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
12370 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74  estA, SRT_Corout
12380 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  ine, regAddrA);.
12390 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
123a0 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20  estInit(&destB, 
123b0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
123c0 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20  egAddrB);..  /* 
123d0 4a 75 6d 70 20 70 61 73 74 20 74 68 65 20 76 61  Jump past the va
123e0 72 69 6f 75 73 20 73 75 62 72 6f 75 74 69 6e 65  rious subroutine
123f0 73 20 61 6e 64 20 63 6f 72 6f 75 74 69 6e 65 73  s and coroutines
12400 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a   to the main.  *
12410 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  * merge loop.  *
12420 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33  /.  j1 = sqlite3
12430 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
12440 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64 72 53 65  _Goto);.  addrSe
12450 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56  lectA = sqlite3V
12460 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
12470 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  );...  /* Genera
12480 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
12490 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
124a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
124b0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74  to the.  ** left
124c0 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
124d0 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20   operator - the 
124e0 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  "A" select..  */
124f0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
12500 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f  nt((v, "Begin co
12510 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74  routine for left
12520 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50   SELECT"));.  pP
12530 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  rior->iLimit = r
12540 65 67 4c 69 6d 69 74 41 3b 0a 20 20 73 71 6c 69  egLimitA;.  sqli
12550 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
12560 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41  , pPrior, &destA
12570 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12580 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
12590 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 41  eger, 1, regEofA
125a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
125b0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
125c0 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
125d0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
125e0 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74  ((v, "End corout
125f0 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c  ine for left SEL
12600 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65  ECT"));..  /* Ge
12610 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
12620 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
12630 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
12640 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65  ent on .  ** the
12650 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22   right - the "B"
12660 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61   select.  */.  a
12670 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c  ddrSelectB = sql
12680 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
12690 64 64 72 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f  ddr(v);.  VdbeNo
126a0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  opComment((v, "B
126b0 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66  egin coroutine f
126c0 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22  or right SELECT"
126d0 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74  ));.  savedLimit
126e0 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
126f0 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d  savedOffset = p-
12700 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69  >iOffset;.  p->i
12710 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74  Limit = regLimit
12720 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  B;.  p->iOffset 
12730 3d 20 30 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  = 0;  .  sqlite3
12740 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
12750 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e  , &destB);.  p->
12760 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69  iLimit = savedLi
12770 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  mit;.  p->iOffse
12780 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b  t = savedOffset;
12790 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
127a0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
127b0 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42 29 3b  er, 1, regEofB);
127c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
127d0 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
127e0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 56  , regAddrB);.  V
127f0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
12800 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e  v, "End coroutin
12810 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45  e for right SELE
12820 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  CT"));..  /* Gen
12830 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
12840 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
12850 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
12860 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65  of the A.  ** se
12870 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
12880 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
12890 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
128a0 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ct..  */.  VdbeN
128b0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
128c0 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
128d0 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f  or A"));.  addrO
128e0 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utA = generateOu
128f0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
12900 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
12910 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
12920 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  A, pDest, regOut
12930 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  A,.             
12940 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
12950 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  yDup, P4_KEYINFO
12960 5f 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65 6c 45  _HANDOFF, labelE
12970 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e  nd);.  .  /* Gen
12980 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
12990 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
129a0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
129b0 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65  of the B.  ** se
129c0 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
129d0 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
129e0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
129f0 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ct..  */.  if( o
12a00 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
12a10 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
12a20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
12a30 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
12a40 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20  tine for B"));. 
12a50 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65     addrOutB = ge
12a60 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
12a70 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a90 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74  p, &destB, pDest
12aa0 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20  , regOutB,.     
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
12ac0 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50 34  rev, pKeyDup, P4
12ad0 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 2c  _KEYINFO_STATIC,
12ae0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
12af0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
12b00 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
12b10 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
12b20 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
12b30 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
12b40 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
12b50 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
12b60 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56  emains..  */.  V
12b70 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
12b80 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
12b90 74 69 6e 65 22 29 29 3b 0a 20 20 69 66 28 20 6f  tine"));.  if( o
12ba0 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20  p==TK_EXCEPT || 
12bb0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
12bc0 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41   ){.    addrEofA
12bd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12be0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
12bf0 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20   0, labelEnd);. 
12c00 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 61 64   }else{  .    ad
12c10 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
12c20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12c30 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 6c 61  _If, regEofB, la
12c40 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c  belEnd);.    sql
12c50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12c60 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
12c70 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
12c80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12c90 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
12ca0 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
12cb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12cc0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
12cd0 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  0, addrEofA);.  
12ce0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
12cf0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
12d00 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
12d10 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
12d20 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t B.  ** are exh
12d30 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
12d40 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41  data in select A
12d50 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
12d60 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45   if( op==TK_INTE
12d70 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
12d80 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41  rEofB = addrEofA
12d90 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
12da0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
12db0 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72  ((v, "eof-B subr
12dc0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
12dd0 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65  ddrEofB = sqlite
12de0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12df0 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c  P_If, regEofA, l
12e00 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71  abelEnd);.    sq
12e10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12e20 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
12e30 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
12e40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12e50 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
12e60 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
12e70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12e80 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
12e90 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20   0, addrEofB);. 
12ea0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
12eb0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
12ec0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42   the case of A<B
12ed0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
12ee0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c  Comment((v, "A-l
12ef0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
12f00 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20  );.  addrAltB = 
12f10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f20 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
12f30 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
12f40 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12f50 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
12f60 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
12f70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12f80 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
12f90 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  EofA, addrEofA);
12fa0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12fb0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
12fc0 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
12fd0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
12fe0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
12ff0 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20  e case of A==B. 
13000 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
13010 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72  _ALL ){.    addr
13020 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
13030 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
13040 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
13050 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
13060 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64  addrAltB;.    ad
13070 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73  drAltB++;.  }els
13080 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  e{.    VdbeNoopC
13090 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71  omment((v, "A-eq
130a0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
130b0 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  ;.    addrAeqB =
130c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
130d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
130e0 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
130f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13100 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
13110 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41  egEofA, addrEofA
13120 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13130 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
13140 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
13150 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  r);.  }..  /* Ge
13160 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
13170 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
13180 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A>B.  */.  Vdb
13190 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
131a0 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74   "A-gt-B subrout
131b0 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67  ine"));.  addrAg
131c0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
131d0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
131e0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
131f0 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
13200 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
13210 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13220 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
13230 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20  addrOutB);.  }. 
13240 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13250 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
13260 72 65 67 41 64 64 72 42 29 3b 0a 20 20 73 71 6c  regAddrB);.  sql
13270 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13280 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42  , OP_If, regEofB
13290 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 73  , addrEofB);.  s
132a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
132b0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
132c0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
132d0 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73  * This code runs
132e0 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c   once to initial
132f0 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  ize everything..
13300 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
13310 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
13320 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13330 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
13340 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 41  eger, 0, regEofA
13350 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13360 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
13370 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 42  eger, 0, regEofB
13380 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13390 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
133a0 75 62 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ub, regAddrA, ad
133b0 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 73 71  drSelectA);.  sq
133c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
133d0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
133e0 41 64 64 72 42 2c 20 61 64 64 72 53 65 6c 65 63  AddrB, addrSelec
133f0 74 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tB);.  sqlite3Vd
13400 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
13410 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72  f, regEofA, addr
13420 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofA);.  sqlite3
13430 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13440 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64  _If, regEofB, ad
13450 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20 49  drEofB);..  /* I
13460 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69  mplement the mai
13470 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  n merge loop.  *
13480 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
13490 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
134a0 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c  abelCmpr);.  sql
134b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
134c0 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  , OP_Permutation
134d0 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
134e0 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49  *)aPermute, P4_I
134f0 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69  NTARRAY);.  sqli
13500 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
13510 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73   OP_Compare, des
13520 74 41 2e 69 4d 65 6d 2c 20 64 65 73 74 42 2e 69  tA.iMem, destB.i
13530 4d 65 6d 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20  Mem, nOrderBy,. 
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13550 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
13560 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59  KeyMerge, P4_KEY
13570 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
13580 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13590 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
135a0 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71  ddrAltB, addrAeq
135b0 42 2c 20 61 64 64 72 41 67 74 42 29 3b 0a 0a 20  B, addrAgtB);.. 
135c0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 65 6d 70   /* Release temp
135d0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 0a  orary registers.
135e0 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72    */.  if( regPr
135f0 65 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ev ){.    sqlite
13600 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
13610 65 28 70 50 61 72 73 65 2c 20 72 65 67 50 72 65  e(pParse, regPre
13620 76 2c 20 6e 4f 72 64 65 72 42 79 2b 31 29 3b 0a  v, nOrderBy+1);.
13630 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
13640 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74  o the this point
13650 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72   in order to ter
13660 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79  minate the query
13670 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
13680 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
13690 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a  (v, labelEnd);..
136a0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
136b0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f  ber of output co
136c0 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
136d0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
136e0 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
136f0 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
13700 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68  = pPrior;.    wh
13710 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
13720 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
13730 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
13740 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
13750 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
13760 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
13770 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  );.  }..  /* Rea
13780 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70  ssembly the comp
13790 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68  ound query so th
137a0 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72  at it will be fr
137b0 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  eed correctly.  
137c0 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
137d0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  g function */.  
137e0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
137f0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
13800 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
13810 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  pPrior);.  }.  p
13820 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
13830 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20  r;..  /*** TBD: 
13840 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69   Insert subrouti
13850 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73  ne calls to clos
13860 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63  e cursors on inc
13870 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73  omplete.  **** s
13880 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a  ubqueries ****/.
13890 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
138a0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
138b0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
138c0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
138d0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
138e0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
138f0 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72  * Forward Declar
13900 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
13910 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
13920 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78  ist(sqlite3*, Ex
13930 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78  prList*, int, Ex
13940 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
13950 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
13960 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65  t(sqlite3*, Sele
13970 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c  ct *, int, ExprL
13980 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ist *);../*.** S
13990 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
139a0 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
139b0 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79  .  Replace every
139c0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a   reference to.**
139d0 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
139e0 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65  le number iTable
139f0 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
13a00 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a  the iColumn-th.*
13a10 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73  * entry in pELis
13a20 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72  t.  (But leave r
13a30 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
13a40 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a   ROWID column .*
13a50 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a  * unchanged.).**
13a60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13a70 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
13a80 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65  flattening proce
13a90 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72  dure.  A subquer
13aa0 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c  y.** whose resul
13ab0 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64  t set is defined
13ac0 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61   by pEList appea
13ad0 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74  rs as entry in t
13ae0 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  he.** FROM claus
13af0 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75  e of a SELECT su
13b00 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45  ch that the VDBE
13b10 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   cursor assigned
13b20 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d   to that.** FORM
13b30 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73   clause entry is
13b40 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72   iTable.  This r
13b50 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20  outine make the 
13b60 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68  necessary .** ch
13b70 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73  anges to pExpr s
13b80 6f 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73  o that it refers
13b90 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
13ba0 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a   source table.**
13bb0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
13bc0 20 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75   rather the resu
13bd0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75  lt set of the su
13be0 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
13bf0 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
13c00 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
13c10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
13c20 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
13c30 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  to this connecti
13c40 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  on */.  Expr *pE
13c50 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45  xpr,        /* E
13c60 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62  xpr in which sub
13c70 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73  stitution occurs
13c80 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
13c90 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ,         /* Tab
13ca0 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  le to be substit
13cb0 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uted */.  ExprLi
13cc0 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
13cd0 20 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72   Substitute expr
13ce0 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  essions */.){.  
13cf0 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
13d00 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
13d10 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
13d20 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  N && pExpr->iTab
13d30 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20  le==iTable ){.  
13d40 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
13d50 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
13d60 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
13d70 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
13d80 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
13d90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13da0 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
13db0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69  pr->iColumn<pELi
13dc0 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
13dd0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
13de0 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
13df0 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26  xpr->pRight==0 &
13e00 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  & pExpr->pList==
13e10 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  0 );.      pNew 
13e20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  = pEList->a[pExp
13e30 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
13e40 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
13e50 20 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20   pNew!=0 );.    
13e60 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e    pExpr->op = pN
13e70 65 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73  ew->op;.      as
13e80 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
13e90 66 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ft==0 );.      p
13ea0 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71  Expr->pLeft = sq
13eb0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
13ec0 20 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20   pNew->pLeft);. 
13ed0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
13ee0 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
13ef0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52  .      pExpr->pR
13f00 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
13f10 70 72 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e  prDup(db, pNew->
13f20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61  pRight);.      a
13f30 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
13f40 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
13f50 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73  pExpr->pList = s
13f60 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
13f70 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 69 73  p(db, pNew->pLis
13f80 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  t);.      pExpr-
13f90 3e 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e  >iTable = pNew->
13fa0 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45  iTable;.      pE
13fb0 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 4e 65 77  xpr->pTab = pNew
13fc0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 70 45  ->pTab;.      pE
13fd0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  xpr->iColumn = p
13fe0 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  New->iColumn;.  
13ff0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
14000 3d 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20  = pNew->iAgg;.  
14010 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e      sqlite3Token
14020 43 6f 70 79 28 64 62 2c 20 26 70 45 78 70 72 2d  Copy(db, &pExpr-
14030 3e 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74  >token, &pNew->t
14040 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  oken);.      sql
14050 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62  ite3TokenCopy(db
14060 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20  , &pExpr->span, 
14070 26 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20  &pNew->span);.  
14080 20 20 20 20 70 45 78 70 72 2d 3e 70 53 65 6c 65      pExpr->pSele
14090 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
140a0 63 74 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e  ctDup(db, pNew->
140b0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
140c0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70  pExpr->flags = p
140d0 4e 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  New->flags;.    
140e0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
140f0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78  ubstExpr(db, pEx
14100 70 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  pr->pLeft, iTabl
14110 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
14120 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45  substExpr(db, pE
14130 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61  xpr->pRight, iTa
14140 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
14150 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
14160 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
14170 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
14180 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
14190 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e  List(db, pExpr->
141a0 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  pList, iTable, p
141b0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74  EList);.  }.}.st
141c0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
141d0 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74  xprList(.  sqlit
141e0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
141f0 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
14200 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
14210 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
14220 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74  t,     /* List t
14230 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68  o scan and in wh
14240 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
14250 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74  titutes */.  int
14260 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
14270 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
14280 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
14290 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
142a0 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
142b0 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
142c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
142d0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
142e0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
142f0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
14300 2b 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78  ++){.    substEx
14310 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  pr(db, pList->a[
14320 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65  i].pExpr, iTable
14330 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d  , pEList);.  }.}
14340 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
14350 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69  stSelect(.  sqli
14360 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
14370 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
14380 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
14390 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
143a0 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
143b0 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77  T statement in w
143c0 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
143d0 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20  stitutions */.  
143e0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
143f0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
14400 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a   be replaced */.
14410 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
14420 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
14430 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
14440 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
14450 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  c;.  struct SrcL
14460 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
14470 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
14480 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
14490 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
144a0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62   p->pEList, iTab
144b0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
144c0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
144d0 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54   p->pGroupBy, iT
144e0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
144f0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
14500 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
14510 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
14520 0a 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c  .  substExpr(db,
14530 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61   p->pHaving, iTa
14540 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
14550 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
14560 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c  >pWhere, iTable,
14570 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
14580 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70  tSelect(db, p->p
14590 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70  Prior, iTable, p
145a0 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d  EList);.  pSrc =
145b0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20   p->pSrc;.  if( 
145c0 70 53 72 63 20 29 7b 0a 20 20 20 20 66 6f 72 28  pSrc ){.    for(
145d0 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49  i=pSrc->nSrc, pI
145e0 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30  tem=pSrc->a; i>0
145f0 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
14600 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
14610 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53  ct(db, pItem->pS
14620 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
14630 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
14640 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  }.}.#endif /* !d
14650 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14660 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
14670 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14680 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23  OMIT_VIEW) */..#
14690 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
146a0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
146b0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
146c0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
146d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
146e0 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
146f0 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
14700 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70  s in order to sp
14710 65 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  eed.** execution
14720 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20  .  It returns 1 
14730 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
14740 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
14750 66 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63  flattening.** oc
14760 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
14770 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
14780 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
14790 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
147a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
147b0 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
147c0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
147d0 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
147e0 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
147f0 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
14800 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
14810 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
14820 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
14830 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
14840 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
14850 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
14860 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
14870 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
14880 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
14890 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
148a0 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
148b0 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
148c0 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
148d0 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
148e0 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
148f0 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
14900 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
14910 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
14920 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
14930 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14940 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
14950 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
14960 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
14970 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
14980 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
14990 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
149a0 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
149b0 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
149c0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
149d0 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
149e0 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
149f0 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
14a00 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
14a10 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69  d for this simpi
14a20 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
14a30 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
14a40 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
14a50 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
14a60 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
14a70 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
14a80 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
14a90 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
14aa0 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
14ab0 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
14ac0 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
14ad0 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
14ae0 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
14af0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
14b00 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
14b10 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
14b20 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
14b30 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
14b40 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
14b50 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
14b60 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
14b70 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
14b80 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
14b90 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
14ba0 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
14bb0 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62  *   (3)  The sub
14bc0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
14bd0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
14be0 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a  f a left outer j
14bf0 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f  oin.**        (O
14c00 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74  riginally ticket
14c10 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67 68 74   #306.  Strenght
14c20 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20 23  ened by ticket #
14c30 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34  3300).**.**   (4
14c40 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
14c50 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20  is not DISTINCT 
14c60 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
14c70 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
14c80 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54  ..**.**   (5)  T
14c90 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
14ca0 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74  ot DISTINCT or t
14cb0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
14cc0 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  oes not use.**  
14cd0 20 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73        aggregates
14ce0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
14cf0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
14d00 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
14d10 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
14d20 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
14d30 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
14d40 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
14d50 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
14d60 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  a FROM clause..*
14d70 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20  *.**   (8)  The 
14d80 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
14d90 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
14da0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
14db0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
14dc0 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73  .**   (9)  The s
14dd0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
14de0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
14df0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
14e00 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
14e10 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
14e20 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68  .**.**  (10)  Th
14e30 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
14e40 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
14e50 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
14e60 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
14e70 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d  *        use LIM
14e80 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20  IT..**.**  (11) 
14e90 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
14ea0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
14eb0 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61  y do not both ha
14ec0 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
14ed0 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29  ses..**.**  (12)
14ee0 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65    Not implemente
14ef0 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  d.  Subsumed int
14f00 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  o restriction (3
14f10 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73  ).  Was previous
14f20 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73  ly.**        a s
14f30 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74  eparate restrict
14f40 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f  ion deriving fro
14f50 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a  m ticket #350..*
14f60 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
14f70 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
14f80 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
14f90 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a  both use LIMIT.*
14fa0 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
14fb0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
14fc0 74 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a  t use OFFSET.**.
14fd0 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75  **  (15)  The ou
14fe0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
14ff0 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
15000 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68  und select or th
15010 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
15020 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61  uery does not ha
15030 76 65 20 62 6f 74 68 20 61 6e 20 4f 52 44 45 52  ve both an ORDER
15040 20 42 59 20 61 6e 64 20 61 20 4c 49 4d 49 54 20   BY and a LIMIT 
15050 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20  clause..**      
15060 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32    (See ticket #2
15070 33 33 39 29 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29  339).**.**  (16)
15080 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
15090 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
150a0 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62  egate or the sub
150b0 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20  query does.**   
150c0 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e       not contain
150d0 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63   ORDER BY.  (Tic
150e0 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73  ket #2942)  This
150f0 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74   used to not mat
15100 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e  ter.**        un
15110 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65  til we introduce
15120 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63  d the group_conc
15130 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  at() function.  
15140 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68  .**.**  (17)  Th
15150 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
15160 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  ot a compound se
15170 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61  lect, or it is a
15180 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20   UNION ALL .**  
15190 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63        compound c
151a0 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e  lause made up en
151b0 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67  tirely of non-ag
151c0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c  gregate queries,
151d0 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20   and .**        
151e0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
151f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
15200 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66   * is not itself
15210 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
15220 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20  und select,.**  
15230 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
15240 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
15250 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c   DISTINCT query,
15260 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
15270 20 2a 20 68 61 73 20 6e 6f 20 6f 74 68 65 72 20   * has no other 
15280 74 61 62 6c 65 73 20 6f 72 20 73 75 62 2d 73 65  tables or sub-se
15290 6c 65 63 74 73 20 69 6e 20 74 68 65 20 46 52 4f  lects in the FRO
152a0 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
152b0 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
152c0 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
152d0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
152e0 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
152f0 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
15300 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
15310 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
15320 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
15330 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
15340 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
15350 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 0a 2a  FFSET clauses..*
15360 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74  *.**  (18)  If t
15370 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
15380 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
15390 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d  t, then all term
153a0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20  s of the.**     
153b0 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75     ORDER by clau
153c0 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  se of the parent
153d0 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20   must be simple 
153e0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a  references to .*
153f0 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73  *        columns
15400 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
15410 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20  y..**.**  (19)  
15420 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
15430 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
15440 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
15450 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
15460 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45        have a WHE
15470 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  RE clause..**.**
15480 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
15490 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
154a0 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
154b0 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
154c0 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
154d0 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
154e0 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
154f0 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
15500 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
15510 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
15520 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
15530 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
15540 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
15550 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
15560 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
15570 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
15580 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
15590 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
155a0 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
155b0 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
155c0 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
155d0 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
155e0 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
155f0 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
15600 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
15610 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
15620 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
15630 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
15640 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
15650 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
15660 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
15670 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
15680 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
15690 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
156a0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
156b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
156c0 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
156d0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
156e0 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
156f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
15700 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
15710 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
15720 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
15730 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
15740 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
15750 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
15760 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
15770 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
15780 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
15790 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
157a0 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
157b0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
157c0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
157d0 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
157e0 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
157f0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65  uthContext;.  Se
15800 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20  lect *pParent;. 
15810 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20   Select *pSub;  
15820 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65       /* The inne
15830 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71  r query or "subq
15840 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63  uery" */.  Selec
15850 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f  t *pSub1;      /
15860 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
15870 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63   rightmost selec
15880 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a  t in sub-query *
15890 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
158a0 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
158b0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
158c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
158d0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62  .  SrcList *pSub
158e0 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52  Src;   /* The FR
158f0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
15900 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45   subquery */.  E
15910 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20  xprList *pList; 
15920 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
15930 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65   set of the oute
15940 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  r query */.  int
15950 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20   iParent;       
15960 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
15970 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53  number of the pS
15980 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65  ub result set te
15990 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  mp table */.  in
159a0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
159b0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
159c0 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  r */.  Expr *pWh
159d0 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ere;            
159e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
159f0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
15a00 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
15a10 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20  item *pSubitem; 
15a20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
15a30 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
15a40 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
15a50 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
15a60 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
15a70 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
15a80 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
15a90 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
15aa0 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   p!=0 );.  if( p
15ab0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
15ac0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72    assert( p->pPr
15ad0 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e  ior==0 );  /* Un
15ae0 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20  able to flatten 
15af0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73  compound queries
15b00 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   */.  pSrc = p->
15b10 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
15b20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
15b30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
15b40 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
15b50 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
15b60 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
15b70 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
15b80 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
15b90 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
15ba0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
15bb0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67  =0 );.  if( isAg
15bc0 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  g && subqueryIsA
15bd0 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  gg ) return 0;  
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15bf0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
15c00 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71  )  */.  if( subq
15c10 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72  ueryIsAgg && pSr
15c20 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75  c->nSrc>1 ) retu
15c30 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
15c40 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
15c50 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20  )  */.  pSubSrc 
15c60 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
15c70 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
15c80 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f  );.  /* Prior to
15c90 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20   version 3.1.2, 
15ca0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
15cb0 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20  FFSET had to be 
15cc0 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73  simple constants
15cd0 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74  ,.  ** not arbit
15ce0 72 61 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e  rary expresssion
15cf0 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f  s, we allowed so
15d00 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20  me combining of 
15d10 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
15d20 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68  .  ** because th
15d30 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70  ey could be comp
15d40 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  uted at compile-
15d50 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20  time.  But when 
15d60 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
15d70 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62  .  ** became arb
15d80 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
15d90 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63  ns, we were forc
15da0 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69  ed to add restri
15db0 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a  ctions (13).  **
15dc0 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20   and (14). */.  
15dd0 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
15de0 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20   && p->pLimit ) 
15df0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
15e00 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
15e10 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20  ction (13) */.  
15e20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65  if( pSub->pOffse
15e30 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
15e60 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20  ction (14) */.  
15e70 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
15e80 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69  t && pSub->pLimi
15e90 74 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  t && pSub->pOrde
15ea0 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rBy ){.    retur
15eb0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ee0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
15ef0 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  15) */.  }.  if(
15f00 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
15f10 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f30 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
15f40 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28  on (7)  */.  if(
15f50 20 28 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67   ((pSub->selFlag
15f60 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
15f70 21 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69  !=0 || pSub->pLi
15f80 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 20 26  mit) .         &
15f90 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  & (pSrc->nSrc>1 
15fa0 7c 7c 20 69 73 41 67 67 29 20 29 7b 20 20 20 20  || isAgg) ){    
15fb0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
15fc0 74 69 6f 6e 73 20 28 34 29 28 35 29 28 38 29 28  tions (4)(5)(8)(
15fd0 39 29 20 2a 2f 0a 20 20 20 20 20 72 65 74 75 72  9) */.     retur
15fe0 6e 20 30 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a  n 0;       .  }.
15ff0 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
16000 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
16010 29 21 3d 30 20 26 26 20 73 75 62 71 75 65 72 79  )!=0 && subquery
16020 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65  IsAgg ){.     re
16030 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
16040 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
16050 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  6)  */.  }.  if(
16060 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
16070 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
16080 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
16090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
160c0 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a  striction (11) *
160d0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  /.  }.  if( isAg
160e0 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  g && pSub->pOrde
160f0 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20  rBy ) return 0; 
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16110 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
16120 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  6) */.  if( pSub
16130 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
16140 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
16150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
16160 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
16170 39 29 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53 4f  9) */..  /* OBSO
16180 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a  LETE COMMENT 1:.
16190 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    ** Restriction
161a0 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71   3:  If the subq
161b0 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20  uery is a join, 
161c0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
161d0 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20  bquery is .  ** 
161e0 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20  not used as the 
161f0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
16200 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20   an outer join. 
16210 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79   Examples of why
16220 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f   this.  ** is no
16230 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
16240 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
16250 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
16260 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a  (t2 JOIN t3).  *
16270 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
16280 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
16290 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
162a0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
162b0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
162c0 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20  IN t2) JOIN t3. 
162d0 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69   **.  ** which i
162e0 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65  s not at all the
162f0 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a   same thing..  *
16300 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20  *.  ** OBSOLETE 
16310 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20  COMMENT 2:.  ** 
16320 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20  Restriction 12: 
16330 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
16340 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
16350 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
16360 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c  outer.  ** join,
16370 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
16380 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57  ubquery has no W
16390 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a  HERE clause..  *
163a0 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66  * An examples of
163b0 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74   why this is not
163c0 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
163d0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
163e0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
163f0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
16400 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20   WHERE t2.x>0). 
16410 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
16420 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
16430 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
16440 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
16450 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
16460 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74  JOIN t2) WHERE t
16470 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  2.x>0.  **.  ** 
16480 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74  But the t2.x>0 t
16490 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  est will always 
164a0 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72  fail on a NULL r
164b0 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a  ow of t2, which.
164c0 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79    ** effectively
164d0 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55   converts the OU
164e0 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e  TER JOIN into an
164f0 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a   INNER JOIN..  *
16500 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52  *.  ** THIS OVER
16510 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43  RIDES OBSOLETE C
16520 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20  OMMENTS 1 AND 2 
16530 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b  ABOVE:.  ** Tick
16540 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74  et #3300 shows t
16550 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  hat flattening t
16560 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
16570 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a   a LEFT JOIN.  *
16580 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74  * is fraught wit
16590 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20  h danger.  Best 
165a0 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f  to avoid the who
165b0 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68  le thing.  If th
165c0 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
165d0 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72  is the right ter
165e0 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
165f0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c  , then do not fl
16600 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  atten..  */.  if
16610 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69  ( (pSubitem->joi
16620 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
16630 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
16640 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
16650 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20  Restriction 17: 
16660 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
16670 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
16680 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d  ELECT, then it m
16690 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c  ust.  ** use onl
166a0 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  y the UNION ALL 
166b0 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f  operator. And no
166c0 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65  ne of the simple
166d0 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a   select queries.
166e0 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75    ** that make u
166f0 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53  p the compound S
16700 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65  ELECT are allowe
16710 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74  d to be aggregat
16720 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20  e or distinct.  
16730 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ** queries..  */
16740 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72  .  if( pSub->pPr
16750 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ior ){.    if( p
16760 2d 3e 70 50 72 69 6f 72 20 7c 7c 20 69 73 41 67  ->pPrior || isAg
16770 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67  g || (p->selFlag
16780 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
16790 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72  !=0 || pSrc->nSr
167a0 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=1 ){.      re
167b0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
167c0 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62    for(pSub1=pSub
167d0 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70  ; pSub1; pSub1=p
167e0 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Sub1->pPrior){. 
167f0 20 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d       if( (pSub1-
16800 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
16810 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
16820 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20  egate))!=0.     
16830 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72    || (pSub1->pPr
16840 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70  ior && pSub1->op
16850 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20  !=TK_ALL) .     
16860 20 20 7c 7c 20 21 70 53 75 62 31 2d 3e 70 53 72    || !pSub1->pSr
16870 63 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63  c || pSub1->pSrc
16880 2d 3e 6e 53 72 63 21 3d 31 0a 20 20 20 20 20 20  ->nSrc!=1.      
16890 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
168a0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
168b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72   }..    /* Restr
168c0 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20  iction 18. */.  
168d0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
168e0 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  y ){.      int i
168f0 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  i;.      for(ii=
16900 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42  0; ii<p->pOrderB
16910 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  y->nExpr; ii++){
16920 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
16930 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e  pOrderBy->a[ii].
16940 69 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  iCol==0 ) return
16950 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
16960 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20  }.  }..  /***** 
16970 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
16980 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69   point, flatteni
16990 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
169a0 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75   *****/..  /* Au
169b0 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71  thorize the subq
169c0 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65  uery */.  pParse
169d0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
169e0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
169f0 3b 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68 43  ;.  sqlite3AuthC
16a00 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
16a10 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
16a20 2c 20 30 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  , 0);.  pParse->
16a30 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
16a40 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
16a50 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
16a60 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
16a70 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
16a80 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62  atement, then (b
16a90 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20  y restrictions. 
16aa0 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62   ** 17 and 18 ab
16ab0 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20  ove) it must be 
16ac0 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20  a UNION ALL and 
16ad0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
16ae0 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f   must .  ** be o
16af0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
16b00 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
16b10 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f   <expr-list> FRO
16b20 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20  M (<sub-query>) 
16b30 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a  <where-clause> .
16b40 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77    **.  ** follow
16b50 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20  ed by any ORDER 
16b60 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72  BY, LIMIT and/or
16b70 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
16b80 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a   This block.  **
16b90 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70   creates N-1 cop
16ba0 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ies of the paren
16bb0 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20  t query without 
16bc0 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
16bd0 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46  MIT or .  ** OFF
16be0 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20  SET clauses and 
16bf0 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68  joins them to th
16c00 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65  e left-hand-side
16c10 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
16c20 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f  .  ** using UNIO
16c30 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e  N ALL operators.
16c40 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20   In this case N 
16c50 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
16c60 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c   simple.  ** sel
16c70 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ect statements i
16c80 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  n the compound s
16c90 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  ub-query..  **. 
16ca0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
16cb0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
16cc0 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a  T a+1 FROM (.  *
16cd0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
16ce0 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  x FROM tab.  ** 
16cf0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
16d00 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
16d10 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20  ECT y FROM tab. 
16d20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
16d30 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
16d40 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
16d50 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20   FROM tab2.  ** 
16d60 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35      ) WHERE a!=5
16d70 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
16d80 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  .  ** Transforme
16d90 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
16da0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31  *     SELECT x+1
16db0 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
16dc0 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  x+1!=5.  **     
16dd0 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
16de0 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52     SELECT y+1 FR
16df0 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31  OM tab WHERE y+1
16e00 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
16e10 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
16e20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b  SELECT abs(z*2)+
16e30 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52  1 FROM tab2 WHER
16e40 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a  E abs(z*2)+1!=5.
16e50 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42    **     ORDER B
16e60 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  Y 1.  **.  ** We
16e70 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22   call this the "
16e80 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
16e90 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20  y flattening".. 
16ea0 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70   */.  for(pSub=p
16eb0 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75  Sub->pPrior; pSu
16ec0 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  b; pSub=pSub->pP
16ed0 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63  rior){.    Selec
16ee0 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70  t *pNew;.    Exp
16ef0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
16f00 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
16f10 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20     Expr *pLimit 
16f20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
16f30 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20   Select *pPrior 
16f40 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
16f50 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
16f60 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
16f70 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  0;.    p->pPrior
16f80 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69   = 0;.    p->pLi
16f90 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  mit = 0;.    pNe
16fa0 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  w = sqlite3Selec
16fb0 74 44 75 70 28 64 62 2c 20 70 29 3b 0a 20 20 20  tDup(db, p);.   
16fc0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
16fd0 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  mit;.    p->pOrd
16fe0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
16ff0 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  .    p->pSrc = p
17000 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  Src;.    p->op =
17010 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e   TK_ALL;.    p->
17020 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a  pRightmost = 0;.
17030 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
17040 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
17050 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73  pPrior;.    }els
17060 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  e{.      pNew->p
17070 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
17080 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67        pNew->pRig
17090 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20  htmost = 0;.    
170a0 7d 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  }.    p->pPrior 
170b0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20  = pNew;.    if( 
170c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
170d0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
170e0 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61  ..  /* Begin fla
170f0 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f  ttening the iFro
17100 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
17110 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20  e FROM clause . 
17120 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72   ** in the outer
17130 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
17140 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53  Sub = pSub1 = pS
17150 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
17160 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
17170 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  e transient tabl
17180 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f  e structure asso
17190 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
171a0 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20    ** subquery.  
171b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
171c0 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
171d0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73  >zDatabase);.  s
171e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
171f0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
17200 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
17210 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
17220 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62  >zAlias);.  pSub
17230 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  item->zDatabase 
17240 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
17250 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53  >zName = 0;.  pS
17260 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ubitem->zAlias =
17270 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
17280 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20  pSelect = 0;..  
17290 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e  /* Defer deletin
172a0 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  g the Table obje
172b0 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
172c0 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
172d0 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20  uery until code 
172e0 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20  generation is.  
172f0 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e  ** complete, sin
17300 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69  ce there may sti
17310 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54  ll exist Expr.pT
17320 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a  ab entries that.
17330 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68    ** refer to th
17340 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20  e subquery even 
17350 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  after flattening
17360 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e  .  Ticket #3346.
17370 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
17380 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b  item->pTab!=0 ){
17390 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
173a0 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d  ToDel = pSubitem
173b0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20  ->pTab;.    if( 
173c0 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d  pTabToDel->nRef=
173d0 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  =1 ){.      pTab
173e0 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62  ToDel->pNextZomb
173f0 69 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 5a 6f  ie = pParse->pZo
17400 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70  mbieTab;.      p
17410 50 61 72 73 65 2d 3e 70 5a 6f 6d 62 69 65 54 61  Parse->pZombieTa
17420 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20  b = pTabToDel;. 
17430 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17440 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d  pTabToDel->nRef-
17450 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75  -;.    }.    pSu
17460 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  bitem->pTab = 0;
17470 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
17480 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75  ollowing loop ru
17490 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
174a0 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f   term in a compo
174b0 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a  und-subquery.  *
174c0 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73  * flattening (as
174d0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
174e0 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f  ).  If we are do
174f0 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20  ing a different 
17500 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61  kind.  ** of fla
17510 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74  ttening - a flat
17520 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61  tening other tha
17530 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
17540 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
17550 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69   -.  ** then thi
17560 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73  s loop only runs
17570 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   once..  **.  **
17580 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73   This loop moves
17590 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d   all of the FROM
175a0 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
175b0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
175c0 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  he.  ** the FROM
175d0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
175e0 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66  uter query.  Bef
175f0 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20  ore doing this, 
17600 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
17610 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
17620 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  for the original
17630 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
17640 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a  M element in.  *
17650 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20  * iParent.  The 
17660 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77  iParent cursor w
17670 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
17680 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63  d.  Subsequent c
17690 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63  ode.  ** will sc
176a0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c  an expressions l
176b0 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65  ooking for iPare
176c0 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  nt references an
176d0 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74  d replace.  ** t
176e0 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20  hose references 
176f0 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73  with expressions
17700 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f   that resolve to
17710 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52   the subquery FR
17720 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73  OM.  ** elements
17730 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79   we are now copy
17740 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66  ing in..  */.  f
17750 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50  or(pParent=p; pP
17760 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70  arent; pParent=p
17770 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20  Parent->pPrior, 
17780 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
17790 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62  r){.    int nSub
177a0 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69  Src;.    int joi
177b0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
177c0 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
177d0 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
177e0 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
177f0 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
17800 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
17810 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
17820 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
17830 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
17840 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
17850 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
17860 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
17870 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
17880 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
17890 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
178a0 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
178b0 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
178c0 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
178d0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
178e0 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
178f0 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  >jointype;.    }
17900 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
17910 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
17920 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
17930 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
17940 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
17950 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
17960 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
17970 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
17980 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
17990 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
179a0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
179b0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
179c0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
179d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
179e0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
179f0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
17a00 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
17a10 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
17a20 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
17a30 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
17a40 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
17a50 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
17a60 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
17a70 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
17a80 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
17a90 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17aa0 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
17ab0 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
17ac0 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
17ad0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
17ae0 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
17af0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
17b00 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
17b10 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
17b20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
17b30 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
17b40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
17b50 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
17b60 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
17b70 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
17b80 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
17b90 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
17ba0 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
17bb0 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
17bc0 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
17bd0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
17be0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
17bf0 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
17c00 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74   query to 4 slot
17c10 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20  s.  The middle. 
17c20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78     ** slot is ex
17c30 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
17c40 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
17c50 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74  make space for t
17c60 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c  he.    ** two el
17c70 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
17c80 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
17c90 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
17ca0 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
17cb0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
17cc0 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
17cd0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
17ce0 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
17cf0 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
17d00 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
17d10 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
17d20 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
17d30 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
17d40 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
17d50 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
17d60 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
17d70 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
17d80 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
17d90 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
17da0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
17db0 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
17dc0 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46      pSrc->a[i+iF
17dd0 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e  rom] = pSubSrc->
17de0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73  a[i];.      mems
17df0 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69  et(&pSubSrc->a[i
17e00 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75  ], 0, sizeof(pSu
17e10 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20  bSrc->a[i]));.  
17e20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b    }.    pSrc->a[
17e30 69 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20  iFrom].jointype 
17e40 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20  = jointype;.  . 
17e50 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20     /* Now begin 
17e60 73 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62  substituting sub
17e70 71 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74  query result set
17e80 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72   expressions for
17e90 20 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e   .    ** referen
17ea0 63 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65  ces to the iPare
17eb0 6e 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  nt in the outer 
17ec0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20  query..    ** . 
17ed0 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
17ee0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
17ef0 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20  ELECT a+5, b*10 
17f00 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33  FROM (SELECT x*3
17f10 20 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62   AS a, y+10 AS b
17f20 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20   FROM t1) WHERE 
17f30 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20  a>b;.    **   \ 
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f50 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
17f60 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f  __ subquery ____
17f70 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
17f80 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f   /.    **    \__
17f90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
17fa0 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20  ___ outer query 
17fb0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
17fc0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
17fd0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65      **.    ** We
17fe0 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65   look at every e
17ff0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
18000 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
18010 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
18020 73 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77  see.    ** "a" w
18030 65 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a  e substitute "x*
18040 33 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61  3" and every pla
18050 63 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65  ce we see "b" we
18060 20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31   substitute "y+1
18070 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  0"..    */.    p
18080 4c 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e  List = pParent->
18090 70 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28  pEList;.    for(
180a0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
180b0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
180c0 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20   Expr *pExpr;.  
180d0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
180e0 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20  [i].zName==0 && 
180f0 28 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  (pExpr = pList->
18100 61 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61  a[i].pExpr)->spa
18110 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  n.z!=0 ){.      
18120 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e    pList->a[i].zN
18130 61 6d 65 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ame = .         
18140 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
18150 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
18160 2a 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c  *)pExpr->span.z,
18170 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b   pExpr->span.n);
18180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18190 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
181a0 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45  (db, pParent->pE
181b0 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70  List, iParent, p
181c0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
181d0 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20    if( isAgg ){. 
181e0 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
181f0 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  st(db, pParent->
18200 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e  pGroupBy, iParen
18210 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
18220 3b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  ;.      substExp
18230 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
18240 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c  Having, iParent,
18250 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
18260 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
18270 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
18280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
18290 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d  arent->pOrderBy=
182a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  =0 );.      pPar
182b0 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  ent->pOrderBy = 
182c0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pSub->pOrderBy;.
182d0 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64        pSub->pOrd
182e0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erBy = 0;.    }e
182f0 6c 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d  lse if( pParent-
18300 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
18310 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
18320 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f  (db, pParent->pO
18330 72 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c  rderBy, iParent,
18340 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
18350 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
18360 75 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20  ub->pWhere ){.  
18370 20 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c      pWhere = sql
18380 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
18390 70 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pSub->pWhere);. 
183a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
183b0 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20  pWhere = 0;.    
183c0 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71 75 65  }.    if( subque
183d0 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ryIsAgg ){.     
183e0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
183f0 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a  ->pHaving==0 );.
18400 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
18410 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74  Having = pParent
18420 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20  ->pWhere;.      
18430 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
18440 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20  = pWhere;.      
18450 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
18460 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
18470 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
18480 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  EList);.      pP
18490 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
184a0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
184b0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
184c0 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20  ving, .         
184d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
184f0 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
18500 2d 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20 20  ->pHaving));.   
18510 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
18520 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
18530 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
18540 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
18550 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
18560 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
18570 42 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  By);.    }else{.
18580 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 28        substExpr(
18590 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  db, pParent->pWh
185a0 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ere, iParent, pS
185b0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
185c0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
185d0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
185e0 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  And(db, pParent-
185f0 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29  >pWhere, pWhere)
18600 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
18610 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20  * The flattened 
18620 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
18630 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  t if either the 
18640 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20  inner or the.   
18650 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
18660 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20  is distinct. .  
18670 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74    */.    pParent
18680 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53  ->selFlags |= pS
18690 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
186a0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20  F_Distinct;.  . 
186b0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c     /*.    ** SEL
186c0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45  ECT ... FROM (SE
186d0 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61  LECT ... LIMIT a
186e0 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54   OFFSET b) LIMIT
186f0 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20   x OFFSET y;.   
18700 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69   **.    ** One i
18710 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79  s tempted to try
18720 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20   to add a and b 
18730 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  to combine the l
18740 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73  imits.  But this
18750 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  .    ** does not
18760 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20   work if either 
18770 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
18780 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
18790 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  ( pSub->pLimit )
187a0 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
187b0 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e  >pLimit = pSub->
187c0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53  pLimit;.      pS
187d0 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ub->pLimit = 0;.
187e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
187f0 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
18800 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
18810 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
18820 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
18830 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
18840 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
18850 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20  e(db, pSub1);.. 
18860 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
18870 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
18880 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
18890 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
188a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
188b0 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  EW) */../*.** An
188c0 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54  alyze the SELECT
188d0 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
188e0 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
188f0 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a   to see if it.**
18900 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d   is a min() or m
18910 61 78 28 29 20 71 75 65 72 79 2e 20 52 65 74 75  ax() query. Retu
18920 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
18930 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52  _MIN or WHERE_OR
18940 44 45 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a  DERBY_MAX if .**
18950 20 69 74 20 69 73 2c 20 6f 72 20 30 20 6f 74 68   it is, or 0 oth
18960 65 72 77 69 73 65 2e 20 41 74 20 70 72 65 73 65  erwise. At prese
18970 6e 74 2c 20 61 20 71 75 65 72 79 20 69 73 20 63  nt, a query is c
18980 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 0a  onsidered to be.
18990 2a 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29  ** a min()/max()
189a0 20 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a   query if:.**.**
189b0 20 20 20 31 2e 20 54 68 65 72 65 20 69 73 20 61     1. There is a
189c0 20 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69   single object i
189d0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
189e0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68  e..**.**   2. Th
189f0 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ere is a single 
18a00 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
18a10 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e  e result set, an
18a20 64 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20  d it is.**      
18a30 65 69 74 68 65 72 20 6d 69 6e 28 78 29 20 6f 72  either min(x) or
18a40 20 6d 61 78 28 78 29 2c 20 77 68 65 72 65 20 78   max(x), where x
18a50 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66   is a column ref
18a60 65 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erence..*/.stati
18a70 63 20 69 6e 74 20 6d 69 6e 4d 61 78 51 75 65 72  c int minMaxQuer
18a80 79 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  y(Select *p){.  
18a90 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45  Expr *pExpr;.  E
18aa0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
18ab0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  = p->pEList;..  
18ac0 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
18ad0 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 57 48  r!=1 ) return WH
18ae0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
18af0 41 4c 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45  AL;.  pExpr = pE
18b00 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
18b10 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78  ;.  pEList = pEx
18b20 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28  pr->pList;.  if(
18b30 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
18b40 47 47 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 70  GG_FUNCTION || p
18b50 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69  EList==0 || pELi
18b60 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
18b70 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
18b80 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
18b90 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  r->op!=TK_AGG_CO
18ba0 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 48  LUMN ) return WH
18bb0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
18bc0 41 4c 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  AL;.  if( pExpr-
18bd0 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65  >token.n!=3 ) re
18be0 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
18bf0 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28  BY_NORMAL;.  if(
18c00 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
18c10 28 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74  ((char*)pExpr->t
18c20 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d  oken.z,"min",3)=
18c30 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
18c40 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
18c50 49 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  IN;.  }else if( 
18c60 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
18c70 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f  (char*)pExpr->to
18c80 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d  ken.z,"max",3)==
18c90 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
18ca0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
18cb0 58 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  X;.  }.  return 
18cc0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
18cd0 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  RMAL;.}../*.** I
18ce0 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
18cf0 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73  t item passed as
18d00 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73   an argument was
18d10 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20   augmented with 
18d20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59  an.** INDEXED BY
18d30 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72   clause, then tr
18d40 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  y to locate the 
18d50 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e  specified index.
18d60 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73   If there.** was
18d70 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61   such a clause a
18d80 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  nd the named ind
18d90 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ex cannot be fou
18da0 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  nd, return .** S
18db0 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20  QLITE_ERROR and 
18dc0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  leave an error i
18dd0 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77  n pParse. Otherw
18de0 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a  ise, populate .*
18df0 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20  * pFrom->pIndex 
18e00 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
18e10 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
18e20 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
18e30 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  kup(Parse *pPars
18e40 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  e, struct SrcLis
18e50 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  t_item *pFrom){.
18e60 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
18e70 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64  b && pFrom->zInd
18e80 65 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  ex ){.    Table 
18e90 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
18ea0 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Tab;.    char *z
18eb0 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a  Index = pFrom->z
18ec0 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78  Index;.    Index
18ed0 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
18ee0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
18ef0 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  x; .        pIdx
18f00 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
18f10 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  mp(pIdx->zName, 
18f20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20  zIndex); .      
18f30 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65    pIdx=pIdx->pNe
18f40 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  xt.    );.    if
18f50 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20  ( !pIdx ){.     
18f60 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18f70 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
18f80 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49  h index: %s", zI
18f90 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  ndex, 0);.      
18fa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
18fb0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
18fc0 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70  From->pIndex = p
18fd0 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Idx;.  }.  retur
18fe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18ff0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
19000 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63  ne is a Walker c
19010 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70  allback for "exp
19020 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54  anding" a SELECT
19030 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22   statement..** "
19040 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73  Expanding" means
19050 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f   to do the follo
19060 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  wing:.**.**    (
19070 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44  1)  Make sure VD
19080 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
19090 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
190a0 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a  gned to every.**
190b0 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74           element
190c0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
190d0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  use..**.**    (2
190e0 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  )  Fill in the p
190f0 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61  TabList->a[].pTa
19100 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20  b fields in the 
19110 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a  SrcList that .**
19120 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73           defines
19130 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57   FROM clause.  W
19140 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72  hen views appear
19150 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
19160 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  use,.**         
19170 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61  fill pTabList->a
19180 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20  [].pSelect with 
19190 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
191a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a  LECT statement.*
191b0 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69  *         that i
191c0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
191d0 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d  ew.  A copy is m
191e0 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27  ade of the view'
191f0 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  s SELECT.**     
19200 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f      statement so
19210 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65   that we can fre
19220 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65  ely modify or de
19230 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  lete that statem
19240 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  ent.**         w
19250 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20  ithout worrying 
19260 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70  about messing up
19270 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74 20   the presistent 
19280 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a  representation.*
19290 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65  *         of the
192a0 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   view..**.**    
192b0 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74  (3)  Add terms t
192c0 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
192d0 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65  se to accomodate
192e0 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
192f0 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
19300 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
19310 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
19320 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
19330 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61  *.**    (4)  Sca
19340 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
19350 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
19360 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
19370 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
19380 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
19390 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
193a0 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
193b0 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
193c0 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
193d0 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
193e0 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
193f0 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
19400 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
19410 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
19420 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
19430 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a  in TABLE..**.*/.
19440 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
19450 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72  tExpander(Walker
19460 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
19470 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
19480 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
19490 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
194a0 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69  i, j, k;.  SrcLi
194b0 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
194c0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
194d0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
194e0 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
194f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
19500 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
19510 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
19520 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75  led  ){.    retu
19530 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
19540 7d 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 3d  }.  if( p->pSrc=
19550 3d 30 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  =0 || (p->selFla
19560 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
19570 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
19580 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
19590 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  }.  p->selFlags 
195a0 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a  |= SF_Expanded;.
195b0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
195c0 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
195d0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f   p->pEList;..  /
195e0 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73  * Make sure curs
195f0 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
19600 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
19610 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a   all entries in.
19620 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
19630 61 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45  ause of the SELE
19640 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
19650 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  */.  sqlite3SrcL
19660 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
19670 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
19680 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75  t);..  /* Look u
19690 70 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61  p every table na
196a0 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
196b0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65  clause of the se
196c0 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61  lect.  If.  ** a
196d0 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46  n entry of the F
196e0 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20  ROM clause is a 
196f0 73 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64  subquery instead
19700 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76   of a table or v
19710 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63  iew,.  ** then c
19720 72 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e  reate a transien
19730 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  t table structur
19740 65 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68  e to describe th
19750 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f  e subquery..  */
19760 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f  .  for(i=0, pFro
19770 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
19780 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
19790 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
197a0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
197b0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
197c0 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20  pTab!=0 ){.     
197d0 20 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   /* This stateme
197e0 6e 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  nt has already b
197f0 65 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54  een prepared.  T
19800 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
19810 20 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66        ** to go f
19820 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20  urther. */.     
19830 20 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b   assert( i==0 );
19840 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
19850 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
19860 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e     if( pFrom->zN
19870 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  ame==0 ){.#ifnde
19880 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
19890 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c  BQUERY.      Sel
198a0 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
198b0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
198c0 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79    /* A sub-query
198d0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
198e0 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
198f0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
19900 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20   pSel!=0 );.    
19910 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
19920 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  >pTab==0 );.    
19930 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
19940 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
19950 6c 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d  l);.      pFrom-
19960 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
19970 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
19980 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
19990 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ble));.      if(
199a0 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
199b0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
199c0 20 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62     pTab->db = db
199d0 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
199e0 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54  ef = 1;.      pT
199f0 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
19a00 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
19a10 73 71 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f  sqlite_subquery_
19a20 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29 70 54 61  %p_", (void*)pTa
19a30 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  b);.      while(
19a40 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b   pSel->pPrior ){
19a50 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
19a60 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65  rior; }.      se
19a70 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
19a80 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
19a90 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70  pSel->pEList, &p
19aa0 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
19ab0 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70  ->aCol);.      p
19ac0 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
19ad0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62  .      pTab->tab
19ae0 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
19af0 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20  meral;.#endif.  
19b00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
19b10 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
19b20 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
19b30 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
19b40 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
19b50 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
19b60 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
19b70 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
19b80 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  = .        sqlit
19b90 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
19ba0 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e  arse,0,pFrom->zN
19bb0 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61  ame,pFrom->zData
19bc0 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  base);.      if(
19bd0 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
19be0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
19bf0 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
19c00 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
19c10 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
19c20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c  || !defined (SQL
19c30 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
19c40 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28  TABLE).      if(
19c50 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c   pTab->pSelect |
19c60 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  | IsVirtual(pTab
19c70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
19c80 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66  We reach here if
19c90 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
19ca0 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76   is a really a v
19cb0 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  iew */.        i
19cc0 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  f( sqlite3ViewGe
19cd0 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
19ce0 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74  rse, pTab) ) ret
19cf0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a  urn WRC_Abort;..
19d00 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46          /* If pF
19d10 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  rom->pSelect!=0 
19d20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
19d30 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20  dealing with a. 
19d40 20 20 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77         ** view w
19d50 69 74 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54  ithin a view.  T
19d60 68 65 20 53 45 4c 45 43 54 20 73 74 72 75 63 74  he SELECT struct
19d70 75 72 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ure has already 
19d80 62 65 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  been.        ** 
19d90 63 6f 70 69 65 64 20 62 79 20 74 68 65 20 6f 75  copied by the ou
19da0 74 65 72 20 76 69 65 77 20 73 6f 20 77 65 20 63  ter view so we c
19db0 61 6e 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79  an skip the copy
19dc0 20 73 74 65 70 20 68 65 72 65 0a 20 20 20 20 20   step here.     
19dd0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e     ** in the inn
19de0 65 72 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20  er view..       
19df0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
19e00 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
19e10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
19e20 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
19e30 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
19e40 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65  (db, pTab->pSele
19e50 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ct);.          s
19e60 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
19e70 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d  (pWalker, pFrom-
19e80 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
19e90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
19ea0 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
19eb0 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  * Locate the ind
19ec0 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20  ex named by the 
19ed0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
19ee0 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  e, if any. */.  
19ef0 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64    if( sqlite3Ind
19f00 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61  exedByLookup(pPa
19f10 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
19f20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
19f30 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Abort;.    }.  }
19f40 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
19f50 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
19f60 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
19f70 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
19f80 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ns..  */.  if( d
19f90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19fa0 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  || sqliteProcess
19fb0 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
19fc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
19fd0 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
19fe0 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
19ff0 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
1a000 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
1a010 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
1a020 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
1a030 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
1a040 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76  les.  And for ev
1a050 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65  ery TABLE.* inse
1a060 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a  rt the names.  *
1a070 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  * of all columns
1a080 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20   in TABLE.  The 
1a090 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20  parser inserted 
1a0a0 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
1a0b0 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74  sion.  ** with t
1a0c0 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74  he TK_ALL operat
1a0d0 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
1a0e0 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
1a0f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
1a100 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  ** The follo
1a110 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
1a120 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
1a130 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69   TK_ALL expressi
1a140 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20  ons and expand. 
1a150 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20   ** each one to 
1a160 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
1a170 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
1a180 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
1a190 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   The first loop 
1a1a0 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73  just checks to s
1a1b0 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
1a1c0 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  any "*" operator
1a1d0 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64  s.  ** that need
1a1e0 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f   expanding..  */
1a1f0 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45  .  for(k=0; k<pE
1a200 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
1a210 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
1a220 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  = pEList->a[k].p
1a230 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
1a240 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
1a250 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45  reak;.    if( pE
1a260 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
1a270 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45  pE->pRight && pE
1a280 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
1a290 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26  _ALL.         &&
1a2a0 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45   pE->pLeft && pE
1a2b0 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
1a2c0 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ID ) break;.  }.
1a2d0 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e    if( k<pEList->
1a2e0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a  nExpr ){.    /*.
1a2f0 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74      ** If we get
1a300 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74   here it means t
1a310 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  he result set co
1a320 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
1a330 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70  re "*".    ** op
1a340 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65  erators that nee
1a350 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
1a360 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  .  Loop through 
1a370 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a  each expression.
1a380 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65      ** in the re
1a390 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70  sult set and exp
1a3a0 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20  and them one by 
1a3b0 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  one..    */.    
1a3c0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1a3d0 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74  item *a = pEList
1a3e0 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ->a;.    ExprLis
1a3f0 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20  t *pNew = 0;.   
1a400 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61   int flags = pPa
1a410 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a  rse->db->flags;.
1a420 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65      int longName
1a430 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c  s = (flags & SQL
1a440 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
1a450 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
1a460 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 66             && (f
1a470 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
1a480 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b  ortColNames)==0;
1a490 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b  ..    for(k=0; k
1a4a0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
1a4b0 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  k++){.      Expr
1a4c0 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70   *pE = a[k].pExp
1a4d0 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  r;.      if( pE-
1a4e0 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20  >op!=TK_ALL &&. 
1a4f0 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f            (pE->o
1a500 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
1a510 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45  >pRight==0 || pE
1a520 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  ->pRight->op!=TK
1a530 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
1a540 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
1a550 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
1a560 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1a570 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
1a580 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1a590 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
1a5a0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1a5b0 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
1a5c0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
1a5d0 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
1a5e0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
1a5f0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
1a600 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
1a610 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  me;.        }.  
1a620 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
1a630 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b   = 0;.        a[
1a640 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
1a650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a660 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
1a670 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
1a680 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
1a690 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
1a6a0 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
1a6b0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
1a6c0 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
1a6d0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
1a6e0 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
1a6f0 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
1a700 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20  char *zTName;   
1a710 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74           /* text
1a720 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
1a730 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
1a740 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
1a750 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a  && pE->pLeft ){.
1a760 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
1a770 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1a780 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d  omToken(db, &pE-
1a790 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a  >pLeft->token);.
1a7a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1a7b0 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
1a7c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
1a7d0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
1a7e0 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
1a7f0 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
1a800 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
1a810 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61  +){.          Ta
1a820 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
1a830 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
1a840 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
1a850 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
1a860 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
1a870 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20   zTabName==0 || 
1a880 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29  zTabName[0]==0 )
1a890 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  { .            z
1a8a0 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
1a8b0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
1a8c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1a8d0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1a8e0 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
1a8f0 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
1a900 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
1a910 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
1a920 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
1a930 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1a940 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a950 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
1a960 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 1;.          f
1a970 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
1a980 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
1a990 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
1a9a0 78 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20  xpr, *pRight;.  
1a9b0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1a9c0 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
1a9d0 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20  ol[j].zName;..  
1a9e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1a9f0 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b  a column is mark
1aa00 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28  ed as 'hidden' (
1aa10 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70  currently only p
1aa20 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
1aa30 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75      ** for virtu
1aa40 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e  al tables), do n
1aa50 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e  ot include it in
1aa60 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20   the expanded.  
1aa70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73            ** res
1aa80 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20  ult-set list..  
1aa90 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1aaa0 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48           if( IsH
1aab0 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
1aac0 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20  b->aCol[j]) ){. 
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1aae0 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54  ert(IsVirtual(pT
1aaf0 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ab));.          
1ab00 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1ab10 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1ab20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
1ab30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b   && zTName==0 ){
1ab40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
1ab50 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1ab60 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61  em *pLeft = &pTa
1ab70 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20  bList->a[i-1];. 
1ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1ab90 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74   (pLeft[1].joint
1aba0 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
1abb0 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
1abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abd0 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66  columnIndex(pLef
1abe0 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e  t->pTab, zName)>
1abf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1ac00 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
1ac10 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
1ac20 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
1ac30 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1ac50 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
1ac60 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
1ac70 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1aca0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
1acb0 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73  dex(pLeft[1].pUs
1acc0 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  ing, zName)>=0 )
1acd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1ace0 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
1acf0 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
1ad00 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
1ad10 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
1ad20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67          ** using
1ad30 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
1ad40 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
1ad50 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght. */.        
1ad60 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1ad70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ad80 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
1ad90 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
1ada0 68 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ht = sqlite3PExp
1adb0 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c  r(pParse, TK_ID,
1adc0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
1add0 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68         if( pRigh
1ade0 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  t==0 ) break;.  
1adf0 20 20 20 20 20 20 20 20 20 20 73 65 74 51 75 6f            setQuo
1ae00 74 65 64 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  tedToken(pParse,
1ae10 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c   &pRight->token,
1ae20 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
1ae30 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
1ae40 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
1ae50 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSrc>1 ){.      
1ae60 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
1ae70 65 66 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  eft = sqlite3PEx
1ae80 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44  pr(pParse, TK_ID
1ae90 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1aea0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
1aeb0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1aec0 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
1aed0 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
1aee0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1aef0 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62  if( pExpr==0 ) b
1af00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1af10 20 20 20 20 73 65 74 51 75 6f 74 65 64 54 6f 6b      setQuotedTok
1af20 65 6e 28 70 50 61 72 73 65 2c 20 26 70 4c 65 66  en(pParse, &pLef
1af30 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61  t->token, zTabNa
1af40 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1af50 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78     setToken(&pEx
1af60 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20 20 20 20  pr->span, .     
1af70 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1af80 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1af90 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
1afa0 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  e, zName));.    
1afb0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1afc0 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20  >span.dyn = 1;. 
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1afe0 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b  pr->token.z = 0;
1aff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1b000 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Expr->token.n = 
1b010 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
1b020 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79   pExpr->token.dy
1b030 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
1b040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b050 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
1b060 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
1b070 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
1b080 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  n = pExpr->token
1b090 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b0a0 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20  pExpr->span.dyn 
1b0b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
1b0c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
1b0d0 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
1b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
1b0f0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1b100 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1b110 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  e, pNew, pExpr, 
1b120 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  &pExpr->span);. 
1b130 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1b140 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b150 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
1b160 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1b170 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
1b180 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  , &pRight->token
1b190 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
1b1a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b1b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1b1c0 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
1b1d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
1b1e0 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
1b1f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1b200 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
1b210 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
1b220 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
1b230 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b240 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b250 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b260 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
1b270 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
1b280 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1b290 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
1b2a0 72 65 65 28 64 62 2c 20 7a 54 4e 61 6d 65 29 3b  ree(db, zTName);
1b2b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b2c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
1b2d0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c  stDelete(db, pEL
1b2e0 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
1b2f0 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
1b300 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
1b310 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70  OLUMN.  if( p->p
1b320 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69  EList && p->pELi
1b330 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  st->nExpr>db->aL
1b340 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
1b350 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
1b360 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1b370 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
1b380 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  ny columns in re
1b390 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a  sult set");.  }.
1b3a0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1b3b0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
1b3c0 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
1b3d0 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
1b3e0 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a  se-tree walker..
1b3f0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1b400 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57  routine is the W
1b410 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
1b420 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73  ack then express
1b430 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65  ion trees.** are
1b440 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20   walked without 
1b450 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e  any actions bein
1b460 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20  g taken at each 
1b470 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c  node.  Presumabl
1b480 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  y,.** when this 
1b490 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1b4a0 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  for Walker.xExpr
1b4b0 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a  Callback then .*
1b4c0 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  * Walker.xSelect
1b4d0 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20  Callback is set 
1b4e0 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
1b4f0 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79  useful for every
1b500 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e   .** subquery in
1b510 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
1b520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b530 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  exprWalkNoop(Wal
1b540 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78  ker *NotUsed, Ex
1b550 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  pr *NotUsed2){. 
1b560 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1b570 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
1b580 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
1b590 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
1b5a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1b5b0 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20  ine "expands" a 
1b5c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1b5d0 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
1b5e0 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46  subqueries..** F
1b5f0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1b600 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61  formation on wha
1b610 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65  t it means to "e
1b620 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a  xpand" a SELECT.
1b630 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65  ** statement, se
1b640 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
1b650 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e   the selectExpan
1b660 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63  d worker callbac
1b670 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45  k above..**.** E
1b680 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43  xpanding a SELEC
1b690 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74  T statement is t
1b6a0 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e  he first step in
1b6b0 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a   processing a.**
1b6c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1b6d0 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73  t.  The SELECT s
1b6e0 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65  tatement must be
1b6f0 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65   expanded before
1b700 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  .** name resolut
1b710 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ion is performed
1b720 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68  ..**.** If anyth
1b730 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
1b740 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1b750 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
1b760 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20   pParse..** The 
1b770 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1b780 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20   can detect the 
1b790 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69  problem by looki
1b7a0 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45  ng at pParse->nE
1b7b0 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61  rr.** and/or pPa
1b7c0 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1b7d0 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ailed..*/.static
1b7e0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c   void sqlite3Sel
1b7f0 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20  ectExpand(Parse 
1b800 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
1b810 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c  *pSelect){.  Wal
1b820 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65  ker w;.  w.xSele
1b830 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
1b840 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77  ectExpander;.  w
1b850 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
1b860 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20   exprWalkNoop;. 
1b870 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
1b880 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
1b890 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
1b8a0 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  ect);.}...#ifnde
1b8b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1b8c0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69  BQUERY./*.** Thi
1b8d0 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53  s is a Walker.xS
1b8e0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61  electCallback ca
1b8f0 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
1b900 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65  qlite3SelectType
1b910 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66  Info().** interf
1b920 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ace..**.** For e
1b930 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  ach FROM-clause 
1b940 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f  subquery, add Co
1b950 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43  lumn.zType and C
1b960 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69  olumn.zColl.** i
1b970 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
1b980 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
1b990 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
1b9a0 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
1b9b0 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71  .** of that subq
1b9c0 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
1b9d0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
1b9e0 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
1b9f0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77  the result set w
1ba00 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a  as constructed.*
1ba10 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e  * by selectExpan
1ba20 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79  der() but the ty
1ba30 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
1ba40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73   information was
1ba50 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74   omitted.** at t
1ba60 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73  hat point becaus
1ba70 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61  e identifiers ha
1ba80 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72  d not yet been r
1ba90 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a  esolved.  This.*
1baa0 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
1bab0 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69  led after identi
1bac0 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  fier resolution.
1bad0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1bae0 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
1baf0 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20  TypeInfo(Walker 
1bb00 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
1bb10 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *p){.  Parse *p
1bb20 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  Parse;.  int i;.
1bb30 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
1bb40 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
1bb50 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
1bb60 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  m;..  assert( p-
1bb70 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
1bb80 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28  esolved );.  if(
1bb90 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1bba0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d  SF_HasTypeInfo)=
1bbb0 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c  =0 ){.    p->sel
1bbc0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54  Flags |= SF_HasT
1bbd0 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61  ypeInfo;.    pPa
1bbe0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
1bbf0 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c  Parse;.    pTabL
1bc00 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
1bc10 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f     for(i=0, pFro
1bc20 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69  m=pTabList->a; i
1bc30 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
1bc40 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a   i++, pFrom++){.
1bc50 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
1bc60 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
1bc70 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20  .      if( pTab 
1bc80 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
1bc90 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
1bca0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)!=0 ){.       
1bcb0 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
1bcc0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1bcd0 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
1bce0 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  /.        Select
1bcf0 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
1bd00 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
1bd10 20 61 73 73 65 72 74 28 20 70 53 65 6c 20 29 3b   assert( pSel );
1bd20 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
1bd30 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70  pSel->pPrior ) p
1bd40 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
1bd50 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65  or;.        sele
1bd60 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
1bd70 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
1bd80 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  se, pTab->nCol, 
1bd90 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c  pTab->aCol, pSel
1bda0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1bdb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
1bdc0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65  C_Continue;.}.#e
1bdd0 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
1bde0 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64  s routine adds d
1bdf0 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  atatype and coll
1be00 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
1be10 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a  nformation to.**
1be20 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
1be30 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f  tures of all FRO
1be40 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
1be50 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45  ies in a.** SELE
1be60 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
1be70 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75  .** Use this rou
1be80 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20  tine after name 
1be90 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
1bea0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
1beb0 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
1bec0 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
1bed0 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
1bee0 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ct){.#ifndef SQL
1bef0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1bf00 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  Y.  Walker w;.  
1bf10 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
1bf20 6b 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62  k = selectAddSub
1bf30 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20  queryTypeInfo;. 
1bf40 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
1bf50 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
1bf60 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
1bf70 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
1bf80 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
1bf90 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d  elect);.#endif.}
1bfa0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
1bfb0 75 74 69 6e 65 20 73 65 74 73 20 6f 66 20 61 20  utine sets of a 
1bfc0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1bfd0 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e   for processing.
1bfe0 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69    The.** followi
1bff0 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68  ng is accomplish
1c000 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  ed:.**.**     * 
1c010 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d   VDBE Cursor num
1c020 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65  bers are assigne
1c030 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  d to all FROM-cl
1c040 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20  ause terms..**  
1c050 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20     *  Ephemeral 
1c060 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72  Table objects ar
1c070 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
1c080 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
1c090 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20  bqueries..**    
1c0a0 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47   *  ON and USING
1c0b0 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69   clauses are shi
1c0c0 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20  fted into WHERE 
1c0d0 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  statements.**   
1c0e0 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22    *  Wildcards "
1c0f0 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22  *" and "TABLE.*"
1c100 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20   in result sets 
1c110 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a  are expanded..**
1c120 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69       *  Identifi
1c130 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ers in expressio
1c140 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f  n are matched to
1c150 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   tables..**.** T
1c160 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
1c170 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
1c180 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77  all subqueries w
1c190 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ithin the SELECT
1c1a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c1b0 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50  3SelectPrep(.  P
1c1c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1c1d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1c1e0 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
1c1f0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
1c200 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
1c210 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1c220 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
1c230 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
1c240 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65  OuterNC  /* Name
1c250 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e   context for con
1c260 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73  tainer */.){.  s
1c270 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
1c280 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
1c290 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1c2a0 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  db;.  if( p->sel
1c2b0 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
1c2c0 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b  peInfo ) return;
1c2d0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1c2e0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
1c2f0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
1c300 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1c310 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
1c320 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
1c330 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
1c340 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1c350 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  urn;.  sqlite3Re
1c360 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
1c370 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74  (pParse, p, pOut
1c380 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61  erNC);.  if( pPa
1c390 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1c3a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1c3b0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1c3c0 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
1c3d0 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
1c3e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
1c3f0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
1c400 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
1c410 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
1c420 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
1c430 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
1c440 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
1c450 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
1c460 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
1c470 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
1c480 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
1c490 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72  tine simply stor
1c4a0 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20  es NULLs in all 
1c4b0 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20  of those memory 
1c4c0 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
1c4d0 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
1c4e0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
1c4f0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
1c500 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
1c510 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1c520 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
1c530 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
1c540 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66  unc *pFunc;.  if
1c550 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
1c560 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  c+pAggInfo->nCol
1c570 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  umn==0 ){.    re
1c580 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  turn;.  }.  for(
1c590 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
1c5a0 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
1c5b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c5c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1c5d0 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61  , 0, pAggInfo->a
1c5e0 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20  Col[i].iMem);.  
1c5f0 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41  }.  for(pFunc=pA
1c600 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69  ggInfo->aFunc, i
1c610 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
1c620 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e  nFunc; i++, pFun
1c630 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c++){.    sqlite
1c640 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c650 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63  P_Null, 0, pFunc
1c660 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28  ->iMem);.    if(
1c670 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
1c680 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  t>=0 ){.      Ex
1c690 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e  pr *pE = pFunc->
1c6a0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
1c6b0 20 70 45 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c   pE->pList==0 ||
1c6c0 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70   pE->pList->nExp
1c6d0 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
1c6e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1c6f0 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
1c700 54 20 69 6e 20 61 67 67 72 65 67 61 74 65 20 6d  T in aggregate m
1c710 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20  ust be followed 
1c720 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 62 79  ".           "by
1c730 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29   an expression")
1c740 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d  ;.        pFunc-
1c750 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
1c760 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c770 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
1c780 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
1c790 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
1c7a0 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29  arse, pE->pList)
1c7b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1c7c0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1c7d0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
1c7e0 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
1c7f0 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c810 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
1c820 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
1c830 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d  ANDOFF);.      }
1c840 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1c850 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f  .** Invoke the O
1c860 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70  P_AggFinalize op
1c870 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 61  code for every a
1c880 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1c890 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49  n.** in the AggI
1c8a0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
1c8b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
1c8c0 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
1c8d0 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ns(Parse *pParse
1c8e0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
1c8f0 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
1c900 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1c910 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1c920 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
1c930 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *pF;.  for(i=0, 
1c940 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
1c950 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
1c960 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
1c970 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
1c980 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78  *pList = pF->pEx
1c990 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73  pr->pList;.    s
1c9a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1c9b0 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c  (v, OP_AggFinal,
1c9c0 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74   pF->iMem, pList
1c9d0 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
1c9e0 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  : 0, 0,.        
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1ca00 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
1ca10 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d  P4_FUNCDEF);.  }
1ca20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
1ca30 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
1ca40 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
1ca50 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62  r an aggregate b
1ca60 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  ased on.** the c
1ca70 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
1ca80 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  sition..*/.stati
1ca90 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63  c void updateAcc
1caa0 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
1cab0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
1cac0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
1cad0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1cae0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
1caf0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1cb00 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72  _func *pF;.  str
1cb10 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
1cb20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f  *pC;..  pAggInfo
1cb30 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  ->directMode = 1
1cb40 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
1cb50 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
1cb60 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
1cb70 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
1cb80 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
1cb90 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
1cba0 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41   0;.    int regA
1cbb0 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  gg;.    ExprList
1cbc0 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
1cbd0 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
1cbe0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
1cbf0 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d     nArg = pList-
1cc00 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65  >nExpr;.      re
1cc10 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65  gAgg = sqlite3Ge
1cc20 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
1cc30 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  e, nArg);.      
1cc40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
1cc50 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1cc60 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30  pList, regAgg, 0
1cc70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1cc80 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20      nArg = 0;.  
1cc90 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a      regAgg = 0;.
1cca0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
1ccb0 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
1ccc0 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74  {.      addrNext
1ccd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1cce0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1ccf0 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
1cd00 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44  1 );.      codeD
1cd10 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
1cd20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
1cd30 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41  ddrNext, 1, regA
1cd40 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gg);.    }.    i
1cd50 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c  f( pF->pFunc->fl
1cd60 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
1cd70 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
1cd80 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
1cd90 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  ll = 0;.      st
1cda0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1cdb0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
1cdc0 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73   int j;.      as
1cdd0 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
1cde0 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69  ;  /* pList!=0 i
1cdf0 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20  f pF->pFunc has 
1ce00 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20  NEEDCOLL */.    
1ce10 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
1ce20 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c  =pList->a; !pCol
1ce30 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b  l && j<nArg; j++
1ce40 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1ce50 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
1ce60 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1ce70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
1ce80 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  xpr);.      }.  
1ce90 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
1cea0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
1ceb0 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
1cec0 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
1ced0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1cee0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
1cef0 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
1cf00 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
1cf10 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
1cf20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
1cf30 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
1cf40 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67  ggStep, 0, regAg
1cf50 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20  g, pF->iMem,.   
1cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf70 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
1cf80 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
1cf90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1cfa0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 6e 41 72  eChangeP5(v, nAr
1cfb0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
1cfc0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
1cfd0 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
1cfe0 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
1cff0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1d000 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
1d010 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
1d020 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78  .    if( addrNex
1d030 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
1d040 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1d050 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b  el(v, addrNext);
1d060 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
1d070 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66  (i=0, pC=pAggInf
1d080 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49  o->aCol; i<pAggI
1d090 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
1d0a0 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20  r; i++, pC++){. 
1d0b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1d0c0 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70  de(pParse, pC->p
1d0d0 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b  Expr, pC->iMem);
1d0e0 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d  .  }.  pAggInfo-
1d0f0 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b  >directMode = 0;
1d100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1d110 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
1d120 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1d130 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20   given in the p 
1d140 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a  argument.  .**.*
1d150 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
1d160 65 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  e distributed in
1d170 20 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65   various ways de
1d180 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a  pending on the.*
1d190 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1d1a0 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72  e SelectDest str
1d1b0 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
1d1c0 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44  o by argument pD
1d1d0 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77  est.** as follow
1d1e0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65  s:.**.**     pDe
1d1f0 73 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73  st->eDest    Res
1d200 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d  ult.**     -----
1d210 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
1d220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d240 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52  ------.**     SR
1d250 54 5f 4f 75 74 70 75 74 20 20 20 20 20 20 47 65  T_Output      Ge
1d260 6e 65 72 61 74 65 20 61 20 72 6f 77 20 6f 66 20  nerate a row of 
1d270 6f 75 74 70 75 74 20 28 75 73 69 6e 67 20 74 68  output (using th
1d280 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a 2a  e OP_ResultRow.*
1d290 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d2a0 20 20 20 20 20 20 6f 70 63 6f 64 65 29 20 66 6f        opcode) fo
1d2b0 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68  r each row in th
1d2c0 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a  e result set..**
1d2d0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20  .**     SRT_Mem 
1d2e0 20 20 20 20 20 20 20 20 4f 6e 6c 79 20 76 61 6c          Only val
1d2f0 69 64 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  id if the result
1d300 20 69 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   is a single col
1d310 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  umn..**         
1d320 20 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 72              Stor
1d330 65 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75  e the first colu
1d340 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  mn of the first 
1d350 72 65 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20 20  result row.**   
1d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d370 20 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44    in register pD
1d380 65 73 74 2d 3e 69 50 61 72 6d 20 74 68 65 6e 20  est->iParm then 
1d390 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 65 73 74  abandon the rest
1d3a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d3b0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 71          of the q
1d3c0 75 65 72 79 2e 20 20 54 68 69 73 20 64 65 73 74  uery.  This dest
1d3d0 69 6e 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  ination implies 
1d3e0 22 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a  "LIMIT 1"..**.**
1d3f0 20 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20       SRT_Set    
1d400 20 20 20 20 20 54 68 65 20 72 65 73 75 6c 74 20       The result 
1d410 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65  must be a single
1d420 20 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20   column.  Store 
1d430 65 61 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 20  each.**         
1d440 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 20              row 
1d450 6f 66 20 72 65 73 75 6c 74 20 61 73 20 74 68 65  of result as the
1d460 20 6b 65 79 20 69 6e 20 74 61 62 6c 65 20 70 44   key in table pD
1d470 65 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20  est->iParm. .** 
1d480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d490 20 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66      Apply the af
1d4a0 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66  finity pDest->af
1d4b0 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74  finity before st
1d4c0 6f 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oring.**        
1d4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
1d4e0 75 6c 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69  ults.  Used to i
1d4f0 6d 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45  mplement "IN (SE
1d500 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a  LECT ...)"..**.*
1d510 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20  *     SRT_Union 
1d520 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
1d530 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20  lts as a key in 
1d540 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
1d550 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  e pDest->iParm..
1d560 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
1d570 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65  cept      Remove
1d580 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68   results from th
1d590 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
1d5a0 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  e pDest->iParm..
1d5b0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61  **.**     SRT_Ta
1d5c0 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20  ble       Store 
1d5d0 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f  results in tempo
1d5e0 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
1d5f0 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20  ->iParm..**     
1d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d610 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54  This is like SRT
1d620 5f 45 70 68 65 6d 54 61 62 20 65 78 63 65 70 74  _EphemTab except
1d630 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a   that the table.
1d640 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1d650 20 20 20 20 20 20 20 69 73 20 61 73 73 75 6d 65         is assume
1d660 64 20 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20  d to already be 
1d670 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  open..**.**     
1d680 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20  SRT_EphemTab    
1d690 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72  Create an tempor
1d6a0 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
1d6b0 3e 69 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65  >iParm and store
1d6c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d6d0 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73 75          the resu
1d6e0 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20 63 75  lt there. The cu
1d6f0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65  rsor is left ope
1d700 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20  n after.**      
1d710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1d720 65 74 75 72 6e 69 6e 67 2e 20 20 54 68 69 73 20  eturning.  This 
1d730 69 73 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c  is like SRT_Tabl
1d740 65 20 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a  e except that.**
1d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d760 20 20 20 20 20 74 68 69 73 20 64 65 73 74 69 6e       this destin
1d770 61 74 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70  ation uses OP_Op
1d780 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 6f 20 63  enEphemeral to c
1d790 72 65 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20  reate.**        
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
1d7b0 20 74 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a   table first..**
1d7c0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f  .**     SRT_Coro
1d7d0 75 74 69 6e 65 20 20 20 47 65 6e 65 72 61 74 65  utine   Generate
1d7e0 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68   a co-routine th
1d7f0 61 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77  at returns a new
1d800 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20   row of.**      
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1d820 65 73 75 6c 74 73 20 65 61 63 68 20 74 69 6d 65  esults each time
1d830 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20   it is invoked. 
1d840 20 54 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74   The entry point
1d850 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d860 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
1d870 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 73 74 6f  o-routine is sto
1d880 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  red in register 
1d890 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
1d8a0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73  .**     SRT_Exis
1d8b0 74 73 20 20 20 20 20 20 53 74 6f 72 65 20 61 20  ts      Store a 
1d8c0 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  1 in memory cell
1d8d0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 69 66   pDest->iParm if
1d8e0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20   the result.**  
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d900 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d     set is not em
1d910 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  pty..**.**     S
1d920 52 54 5f 44 69 73 63 61 72 64 20 20 20 20 20 54  RT_Discard     T
1d930 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73  hrow the results
1d940 20 61 77 61 79 2e 20 20 54 68 69 73 20 69 73 20   away.  This is 
1d950 75 73 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a  used by SELECT.*
1d960 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d970 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73        statements
1d980 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73   within triggers
1d990 20 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70   whose only purp
1d9a0 6f 73 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ose is.**       
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
1d9c0 65 20 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f  e side-effects o
1d9d0 66 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a  f functions..**.
1d9e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d9f0 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
1da00 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
1da10 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
1da20 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
1da30 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
1da40 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
1da50 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
1da60 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
1da70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1da80 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
1da90 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
1daa0 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
1dab0 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
1dac0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
1dad0 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  s to do that..*/
1dae0 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
1daf0 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
1db00 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
1db10 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
1db20 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1db30 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1db40 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
1db50 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
1db60 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ed. */.  SelectD
1db70 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20  est *pDest      
1db80 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
1db90 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73  th the query res
1dba0 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
1dbb0 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
1dbc0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1dbd0 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
1dbe0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
1dbf0 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
1dc00 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1dc10 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
1dc20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dc30 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
1dc40 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
1dc50 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
1dc60 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
1dc70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
1dc80 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
1dc90 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
1dca0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
1dcb0 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69  List;      /* Li
1dcc0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
1dcd0 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
1dce0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1dcf0 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
1dd00 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
1dd10 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
1dd20 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
1dd30 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1dd40 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1dd50 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
1dd60 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
1dd70 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
1dd80 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
1dd90 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
1dda0 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
1ddb0 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
1ddc0 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
1ddd0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
1dde0 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20   *pHaving;      
1ddf0 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47     /* The HAVING
1de00 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
1de10 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69   NULL */.  int i
1de20 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
1de30 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1de40 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
1de50 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
1de60 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20    int distinct; 
1de70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1de80 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  e to use for the
1de90 20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f   distinct set */
1dea0 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
1deb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1dec0 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
1ded0 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
1dee0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72  */.  int addrSor
1def0 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41  tIndex;     /* A
1df00 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f  ddress of an OP_
1df10 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
1df20 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41  struction */.  A
1df30 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
1df40 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
1df50 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
1df60 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
1df70 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
1df80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1df90 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
1dfa0 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
1dfb0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
1dfc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dfd0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1dfe0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20  tion */..  db = 
1dff0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1e000 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
1e010 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
1e020 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
1e030 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1e040 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1e050 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1e060 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
1e070 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
1e080 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
1e090 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
1e0a0 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20  (sAggInfo));..  
1e0b0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
1e0c0 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67  rderBy;.  if( Ig
1e0d0 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
1e0e0 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  Dest) ){.    p->
1e0f0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20  pOrderBy = 0;.. 
1e100 20 20 20 2f 2a 20 49 6e 20 74 68 65 73 65 20 63     /* In these c
1e110 61 73 65 73 20 74 68 65 20 44 49 53 54 49 4e 43  ases the DISTINC
1e120 54 20 6f 70 65 72 61 74 6f 72 20 6d 61 6b 65 73  T operator makes
1e130 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 74   no difference t
1e140 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73  o the.    ** res
1e150 75 6c 74 73 2c 20 73 6f 20 72 65 6d 6f 76 65 20  ults, so remove 
1e160 69 74 20 69 66 20 69 74 20 77 65 72 65 20 73 70  it if it were sp
1e170 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a  ecified..    */.
1e180 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
1e190 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
1e1a0 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
1e1b0 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
1e1c0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
1e1d0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
1e1e0 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
1e1f0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
1e200 61 72 64 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c  ard);.    p->sel
1e210 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
1e220 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  tinct;.  }.  sql
1e230 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
1e240 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20  Parse, p, 0);.  
1e250 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1e260 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1e270 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
1e280 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
1e290 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
1e2a0 20 70 4f 72 64 65 72 42 79 3b 0a 0a 0a 20 20 2f   pOrderBy;...  /
1e2b0 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70  * Make local cop
1e2c0 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d  ies of the param
1e2d0 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20 71  eters for this q
1e2e0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61  uery..  */.  pTa
1e2f0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1e300 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73  .  isAgg = (p->s
1e310 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
1e320 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 70 45  regate)!=0;.  pE
1e330 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
1e340 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  ;.  if( pEList==
1e350 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
1e360 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  end;..  /* .  **
1e370 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74   Do not even att
1e380 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65  empt to generate
1e390 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20   any code if we 
1e3a0 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65 65  have already see
1e3b0 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65  n.  ** errors be
1e3c0 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
1e3d0 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20  e starts..  */. 
1e3e0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1e3f0 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  r>0 ) goto selec
1e400 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 4f 52 44  t_end;..  /* ORD
1e410 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64  ER BY is ignored
1e420 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e   for some destin
1e430 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
1e440 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
1e450 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
1e460 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
1e470 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20    }..  /* Begin 
1e480 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
1e490 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
1e4a0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1e4b0 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
1e4c0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1e4d0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1e4e0 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
1e4f0 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
1e500 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
1e510 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
1e520 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1e530 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1e540 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1e550 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
1e560 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
1e570 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
1e580 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
1e590 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1e5a0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
1e5b0 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
1e5c0 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
1e5d0 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
1e5e0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
1e5f0 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
1e600 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
1e610 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70   || pItem->isPop
1e620 75 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e 75  ulated ) continu
1e630 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65  e;..    /* Incre
1e640 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
1e650 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
1e660 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
1e670 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
1e680 2a 20 74 72 65 65 20 72 65 66 65 72 65 64 20 74  * tree refered t
1e690 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70  o by this, the p
1e6a0 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68  arent select. Th
1e6b0 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20  e child select. 
1e6c0 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69     ** may contai
1e6d0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
1e6e0 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20  es of at most.  
1e6f0 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58    ** (SQLITE_MAX
1e700 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73  _EXPR_DEPTH-Pars
1e710 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68  e.nHeight) heigh
1e720 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74  t. This is a bit
1e730 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e  .    ** more con
1e740 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e  servative than n
1e750 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75  ecessary, but mu
1e760 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65  ch easier than e
1e770 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20  nforcing.    ** 
1e780 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a  an exact limit..
1e790 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73      */.    pPars
1e7a0 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71  e->nHeight += sq
1e7b0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
1e7c0 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f  eight(p);..    /
1e7d0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1e7e0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63  f the subquery c
1e7f0 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69  an be absorbed i
1e800 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20  nto the parent. 
1e810 2a 2f 0a 20 20 20 20 69 73 41 67 67 53 75 62 20  */.    isAggSub 
1e820 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  = (pSub->selFlag
1e830 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
1e840 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c  )!=0;.    if( fl
1e850 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
1e860 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
1e870 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a  g, isAggSub) ){.
1e880 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53        if( isAggS
1e890 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ub ){.        is
1e8a0 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Agg = 1;.       
1e8b0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
1e8c0 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
1e8d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20      }.      i = 
1e8e0 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
1e8f0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
1e900 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
1e910 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20  , SRT_EphemTab, 
1e920 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
1e930 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e940 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
1e950 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  d==0 );.      sq
1e960 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
1e970 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
1e980 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
1e990 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a  sPopulated = 1;.
1e9a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
1e9b0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
1e9c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1e9d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
1e9e0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
1e9f0 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
1ea00 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
1ea10 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
1ea20 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
1ea30 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66   p->pSrc;.    if
1ea40 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  ( !IgnorableOrde
1ea50 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
1ea60 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70      pOrderBy = p
1ea70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
1ea80 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d  }.  }.  pEList =
1ea90 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64   p->pEList;.#end
1eaa0 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  if.  pWhere = p-
1eab0 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
1eac0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
1ead0 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
1eae0 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44  ->pHaving;.  isD
1eaf0 69 73 74 69 6e 63 74 20 3d 20 28 70 2d 3e 73 65  istinct = (p->se
1eb00 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1eb10 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64  inct)!=0;..#ifnd
1eb20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
1eb30 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
1eb40 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
1eb50 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f  are a sequence o
1eb60 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68  f queries, do th
1eb70 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66  e earlier ones f
1eb80 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irst..  */.  if(
1eb90 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
1eba0 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d    if( p->pRightm
1ebb0 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ost==0 ){.      
1ebc0 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a  Select *pLoop, *
1ebd0 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20  pRight = 0;.    
1ebe0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
1ebf0 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63       int mxSelec
1ec00 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f  t;.      for(pLo
1ec10 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
1ec20 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
1ec30 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20  , cnt++){.      
1ec40 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d    pLoop->pRightm
1ec50 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ost = p;.       
1ec60 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20   pLoop->pNext = 
1ec70 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
1ec80 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a  pRight = pLoop;.
1ec90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78        }.      mx
1eca0 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69  Select = db->aLi
1ecb0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
1ecc0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
1ecd0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53  ];.      if( mxS
1ece0 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53  elect && cnt>mxS
1ecf0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
1ed00 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1ed10 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
1ed20 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70  ny terms in comp
1ed30 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20  ound SELECT");. 
1ed40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
1ed50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ed60 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53     return multiS
1ed70 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
1ed80 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 23 65 6e   pDest);.  }.#en
1ed90 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  dif..  /* If wri
1eda0 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
1edb0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
1edc0 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
1edd0 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
1ede0 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
1edf0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ee00 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1ee10 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74  if( checkForMult
1ee20 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72  iColumnSelectErr
1ee30 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  or(pParse, pDest
1ee40 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
1ee50 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
1ee60 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
1ee70 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73  dif..  /* If pos
1ee80 73 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20 74  sible, rewrite t
1ee90 68 65 20 71 75 65 72 79 20 74 6f 20 75 73 65 20  he query to use 
1eea0 47 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61 64  GROUP BY instead
1eeb0 20 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20 20   of DISTINCT..  
1eec0 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68  ** GROUP BY migh
1eed0 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2c 20  t use an index, 
1eee0 44 49 53 54 49 4e 43 54 20 6e 65 76 65 72 20 64  DISTINCT never d
1eef0 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  oes..  */.  if( 
1ef00 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
1ef10 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1ef20 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
1ef30 69 73 74 69 6e 63 74 20 26 26 20 21 70 2d 3e 70  istinct && !p->p
1ef40 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 70  GroupBy ){.    p
1ef50 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
1ef60 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1ef70 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
1ef80 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
1ef90 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
1efa0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
1efb0 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20  SF_Distinct;.   
1efc0 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b   isDistinct = 0;
1efd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1efe0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
1eff0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
1f000 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a  this sorting.  *
1f010 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e  * index might en
1f020 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65  d up being unuse
1f030 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
1f040 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61  n be .  ** extra
1f050 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74  cted in pre-sort
1f060 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68  ed order.  If th
1f070 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
1f080 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50  then the.  ** OP
1f090 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
1f0a0 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
1f0b0 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  be changed to an
1f0c0 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20   OP_Noop once.  
1f0d0 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ** we figure out
1f0e0 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
1f0f0 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e  g index is not n
1f100 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72  eeded.  The addr
1f110 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76  SortIndex.  ** v
1f120 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
1f130 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68  to facilitate th
1f140 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  at change..  */.
1f150 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
1f160 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
1f170 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65  KeyInfo;.    pKe
1f180 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
1f190 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
1f1a0 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  se, pOrderBy);. 
1f1b0 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
1f1c0 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
1f1d0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61  nTab++;.    p->a
1f1e0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d  ddrOpenEphm[2] =
1f1f0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
1f200 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1f210 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
1f220 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f240 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42           pOrderB
1f250 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72  y->iECursor, pOr
1f260 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20  derBy->nExpr+2, 
1f270 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1f290 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
1f2a0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
1f2b0 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  F);.  }else{.   
1f2c0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
1f2d0 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
1f2e0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
1f2f0 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
1f300 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
1f310 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
1f320 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
1f330 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
1f340 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
1f350 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f360 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
1f370 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61 72  ral, pDest->iPar
1f380 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  m, pEList->nExpr
1f390 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
1f3a0 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20   the limiter..  
1f3b0 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69  */.  iEnd = sqli
1f3c0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1f3d0 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  (v);.  computeLi
1f3e0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
1f3f0 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a  rse, p, iEnd);..
1f400 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74    /* Open a virt
1f410 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65  ual index to use
1f420 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63   for the distinc
1f430 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  t set..  */.  if
1f440 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  ( isDistinct ){.
1f450 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
1f460 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65 72  yInfo;.    asser
1f470 74 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f  t( isAgg || pGro
1f480 75 70 42 79 20 29 3b 0a 20 20 20 20 64 69 73 74  upBy );.    dist
1f490 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
1f4a0 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49  Tab++;.    pKeyI
1f4b0 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
1f4c0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
1f4d0 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
1f4e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f4f0 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
1f500 68 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e 63  hemeral, distinc
1f510 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
1f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f530 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
1f540 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
1f550 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DOFF);.  }else{.
1f560 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d      distinct = -
1f570 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67  1;.  }..  /* Agg
1f580 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61  regate and non-a
1f590 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
1f5a0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66   are handled dif
1f5b0 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66  ferently */.  if
1f5c0 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
1f5d0 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
1f5e0 2a 20 54 68 69 73 20 63 61 73 65 20 69 73 20 66  * This case is f
1f5f0 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  or non-aggregate
1f600 20 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20   queries.    ** 
1f610 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
1f620 73 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20  se scan.    */. 
1f630 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
1f640 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
1f650 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
1f660 70 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42  pWhere, &pOrderB
1f670 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  y, 0);.    if( p
1f680 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
1f690 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20  select_end;..   
1f6a0 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69   /* If sorting i
1f6b0 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72  ndex that was cr
1f6c0 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72  eated by a prior
1f6d0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1f6e0 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  l .    ** instru
1f6f0 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e  ction ended up n
1f700 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c  ot being needed,
1f710 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65   then change the
1f720 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1f730 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e  l.    ** into an
1f740 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f   OP_Noop..    */
1f750 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f 72  .    if( addrSor
1f760 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f 72  tIndex>=0 && pOr
1f770 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
1f780 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1f790 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
1f7a0 72 53 6f 72 74 49 6e 64 65 78 2c 20 31 29 3b 0a  rSortIndex, 1);.
1f7b0 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
1f7c0 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20  nEphm[2] = -1;. 
1f7d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65     }..    /* Use
1f7e0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e   the standard in
1f7f0 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a  ner loop.    */.
1f800 20 20 20 20 61 73 73 65 72 74 28 21 69 73 44 69      assert(!isDi
1f810 73 74 69 6e 63 74 29 3b 0a 20 20 20 20 73 65 6c  stinct);.    sel
1f820 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
1f830 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20  rse, p, pEList, 
1f840 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20  0, 0, pOrderBy, 
1f850 2d 31 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20  -1, pDest,.     
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1f870 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
1f880 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
1f890 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74  );..    /* End t
1f8a0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
1f8b0 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
1f8c0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
1f8d0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c  d(pWInfo);.  }el
1f8e0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
1f8f0 69 73 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  is the processin
1f900 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
1f910 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e  queries */.    N
1f920 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
1f930 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
1f940 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  xt for processin
1f950 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  g aggregate info
1f960 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
1f970 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20  nt iAMem;       
1f980 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
1f990 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72  address for stor
1f9a0 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55  ing current GROU
1f9b0 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
1f9c0 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iBMem;          
1f9d0 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
1f9e0 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75  ress for previou
1f9f0 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  s GROUP BY */.  
1fa00 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20    int iUseFlag; 
1fa10 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64        /* Mem add
1fa20 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61  ress holding fla
1fa30 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  g indicating tha
1fa40 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  t at least.     
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa60 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66     ** one row of
1fa70 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
1fa80 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73  e aggregator has
1fa90 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1fab0 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
1fac0 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67    int iAbortFlag
1fad0 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64  ;     /* Mem add
1fae0 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65  ress which cause
1faf0 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66  s query abort if
1fb00 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20   positive */.   
1fb10 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74   int groupBySort
1fb20 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d  ;    /* Rows com
1fb30 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e  e from source in
1fb40 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20   GROUP BY order 
1fb50 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  */.    int addrE
1fb60 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  nd;        /* En
1fb70 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20  d of processing 
1fb80 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
1fb90 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  */..    /* Remov
1fba0 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c  e any and all al
1fbb0 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68  iases between th
1fbc0 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
1fbd0 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55   the.    ** GROU
1fbe0 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  P BY clause..   
1fbf0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
1fc00 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
1fc10 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  t k;            
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1fc30 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1fc40 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
1fc50 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1fc60 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  ;  /* For loopin
1fc70 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f  g over expressio
1fc80 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a  n in a list */..
1fc90 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70        for(k=p->p
1fca0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  EList->nExpr, pI
1fcb0 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  tem=p->pEList->a
1fcc0 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65  ; k>0; k--, pIte
1fcd0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  m++){.        pI
1fce0 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b  tem->iAlias = 0;
1fcf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1fd00 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
1fd10 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
1fd20 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
1fd30 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
1fd40 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69       pItem->iAli
1fd50 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
1fd60 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20      }.. .    /* 
1fd70 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74  Create a label t
1fd80 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77  o jump to when w
1fd90 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20  e want to abort 
1fda0 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  the query */.   
1fdb0 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74   addrEnd = sqlit
1fdc0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1fdd0 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76  v);..    /* Conv
1fde0 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ert TK_COLUMN no
1fdf0 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f  des into TK_AGG_
1fe00 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20  COLUMN and make 
1fe10 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a  entries in.    *
1fe20 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61  * sAggInfo for a
1fe30 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  ll TK_AGG_FUNCTI
1fe40 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72  ON nodes in expr
1fe50 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  essions of the. 
1fe60 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61     ** SELECT sta
1fe70 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  tement..    */. 
1fe80 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
1fe90 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
1fea0 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20  .    sNC.pParse 
1feb0 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e  = pParse;.    sN
1fec0 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
1fed0 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70  bList;.    sNC.p
1fee0 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49  AggInfo = &sAggI
1fef0 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  nfo;.    sAggInf
1ff00 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
1ff10 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47   = pGroupBy ? pG
1ff20 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20  roupBy->nExpr+1 
1ff30 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
1ff40 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
1ff50 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74  oupBy;.    sqlit
1ff60 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
1ff70 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
1ff80 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
1ff90 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
1ffa0 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79  t(&sNC, pOrderBy
1ffb0 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69  );.    if( pHavi
1ffc0 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
1ffd0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1ffe0 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70  gregates(&sNC, p
1fff0 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20  Having);.    }. 
20000 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63     sAggInfo.nAcc
20010 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49  umulator = sAggI
20020 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  nfo.nColumn;.   
20030 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
20040 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29  Info.nFunc; i++)
20050 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
20060 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
20070 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
20080 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
20090 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  >pList);.    }. 
200a0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
200b0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
200c0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20  elect_end;..    
200d0 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f  /* Processing fo
200e0 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  r aggregates wit
200f0 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65  h GROUP BY is ve
20100 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64  ry different and
20110 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72  .    ** much mor
20120 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61  e complex than a
20130 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75  ggregates withou
20140 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20  t a GROUP BY..  
20150 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
20160 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
20170 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
20180 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66  ;  /* Keying inf
20190 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
201a0 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
201b0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31   */.      int j1
201c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
201d0 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73   A-vs-B comparis
201e0 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20  ion jump */.    
201f0 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74    int addrOutput
20200 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  Row;  /* Start o
20210 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  f subroutine tha
20220 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75  t outputs a resu
20230 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  lt row */.      
20240 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77  int regOutputRow
20250 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64  ;   /* Return ad
20260 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
20270 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  or output subrou
20280 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
20290 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20  t addrSetAbort; 
202a0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f    /* Set the abo
202b0 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75  rt flag and retu
202c0 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rn */.      int 
202d0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
202e0 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
202f0 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
20300 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
20310 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f  gIdx; /* The OP_
20320 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f  OpenEphemeral fo
20330 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
20340 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
20350 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20   addrReset;     
20360 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66   /* Subroutine f
20370 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  or resetting the
20380 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a   accumulator */.
20390 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73        int regRes
203a0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74  et;       /* Ret
203b0 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
203c0 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73  ster for reset s
203d0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  ubroutine */..  
203e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
203f0 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  is a GROUP BY cl
20400 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65  ause we might ne
20410 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  ed a sorting ind
20420 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69  ex to.      ** i
20430 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c  mplement it.  Al
20440 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74  locate that sort
20450 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20  ing index now.  
20460 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a  If it turns out.
20470 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
20480 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20   do not need it 
20490 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f  after all, the O
204a0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
204b0 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  truction.      *
204c0 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  * will be conver
204d0 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e  ted into a Noop.
204e0 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
204f0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
20500 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ngIdx = pParse->
20510 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b  nTab++;.      pK
20520 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
20530 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
20540 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a  rse, pGroupBy);.
20550 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
20560 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
20570 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
20580 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20  penEphemeral, . 
20590 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
205a0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41  o.sortingIdx, sA
205b0 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
205c0 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20  olumn, .        
205d0 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79    0, (char*)pKey
205e0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
205f0 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20  _HANDOFF);..    
20600 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
20610 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
20620 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
20630 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
20640 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
20650 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
20660 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
20670 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
20680 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
20690 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74  em;.      regOut
206a0 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73  putRow = ++pPars
206b0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
206c0 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
206d0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
206e0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65  bel(v);.      re
206f0 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  gReset = ++pPars
20700 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
20710 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
20720 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
20730 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  v);.      iAMem 
20740 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
20750 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
20760 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
20770 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
20780 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
20790 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
207a0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
207b0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
207c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
207d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
207e0 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f  Integer, 0, iAbo
207f0 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
20800 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
20810 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
20820 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
20830 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20840 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
20850 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
20860 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
20870 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75  "indicate accumu
20880 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a  lator empty"));.
20890 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  .      /* Begin 
208a0 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
208b0 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75   extract all sou
208c0 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55  rce rows in GROU
208d0 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20  P BY order..    
208e0 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
208f0 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61  involve two sepa
20900 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20  rate loops with 
20910 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65  an OP_Sort in be
20920 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20  tween, or.      
20930 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ** it might be a
20940 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61   single loop tha
20950 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
20960 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
20970 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  mation.      ** 
20980 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64  in the right ord
20990 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  er to begin with
209a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
209b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
209c0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
209d0 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
209e0 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  set);.      pWIn
209f0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
20a00 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
20a10 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
20a20 20 26 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a   &pGroupBy, 0);.
20a30 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
20a40 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
20a50 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28  t_end;.      if(
20a60 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
20a70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
20a80 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65  ptimizer is able
20a90 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73   to deliver rows
20aa0 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64   in group by ord
20ab0 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a  er so.        **
20ac0 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
20ad0 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50  to sort.  The OP
20ae0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74  _OpenEphemeral t
20af0 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  able will be.   
20b00 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65       ** cancelle
20b10 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20  d later because 
20b20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
20b30 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66   use the pKeyInf
20b40 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  o.        */.   
20b50 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20       pGroupBy = 
20b60 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
20b70 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
20b80 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
20b90 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  e{.        /* Ro
20ba0 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75  ws are coming ou
20bb0 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65  t in undetermine
20bc0 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76  d order.  We hav
20bd0 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20  e to push.      
20be0 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e    ** each row in
20bf0 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
20c00 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ex, terminate th
20c10 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20  e first loop,.  
20c20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f        ** then lo
20c30 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74  op over the sort
20c40 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64  ing index in ord
20c50 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75  er to get the ou
20c60 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  tput.        ** 
20c70 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a  in sorted order.
20c80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
20c90 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a     int regBase;.
20ca0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52          int regR
20cb0 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69  ecord;.        i
20cc0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt nCol;.       
20cd0 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a   int nGroupBy;..
20ce0 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
20cf0 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
20d00 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
20d10 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
20d20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
20d30 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20  upBy + 1;.      
20d40 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
20d50 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
20d60 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
20d70 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
20d80 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
20d90 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
20da0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
20db0 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
20dc0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
20dd0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
20de0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20df0 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
20e00 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
20e10 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
20e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20e30 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
20e40 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
20e50 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20  , regBase, 0);. 
20e60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20e70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
20e80 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66  equence, sAggInf
20e90 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67  o.sortingIdx,reg
20ea0 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a  Base+nGroupBy);.
20eb0 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
20ec0 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20  upBy+1;.        
20ed0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
20ee0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
20ef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
20f00 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
20f10 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66  *pCol = &sAggInf
20f20 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  o.aCol[i];.     
20f30 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
20f40 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
20f50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
20f60 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42  nt r1 = j + regB
20f70 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ase;.           
20f80 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20   int r2;..      
20f90 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
20fa0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
20fb0 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20  umn(pParse, .   
20fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
20fe0 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43  ->pTab, pCol->iC
20ff0 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61  olumn, pCol->iTa
21000 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20  ble, r1, 0);.   
21010 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31 21           if( r1!
21020 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =r2 ){.         
21030 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21040 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
21050 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20  py, r2, r1);.   
21060 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21070 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
21080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21090 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63  }.        regRec
210a0 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
210b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
210c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
210d0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
210e0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
210f0 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52  Base, nCol, regR
21100 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
21110 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21120 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
21130 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
21140 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72  ingIdx, regRecor
21150 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
21160 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
21170 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
21180 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
21190 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
211a0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
211b0 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  gBase, nCol);.  
211c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
211d0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
211e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
211f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
21200 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
21210 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
21220 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
21230 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
21240 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20  UP BY sort"));. 
21250 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
21260 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
21270 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  1;.      }..    
21280 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
21290 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
212a0 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
212b0 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
212c0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
212d0 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
212e0 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
212f0 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
21300 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
21310 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
21320 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
21330 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
21340 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
21350 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
21360 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
21370 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
21380 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
21390 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
213a0 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
213b0 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
213c0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
213d0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
213e0 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
213f0 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
21400 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
21410 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
21420 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
21430 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41  v, OP_Column, sA
21440 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
21450 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  x, j, iBMem+j);.
21460 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21470 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
21480 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  o.directMode = 1
21490 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
214a0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
214b0 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
214c0 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b  j].pExpr, iBMem+
214d0 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  j);.        }.  
214e0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
214f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
21500 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d   OP_Compare, iAM
21510 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75  em, iBMem, pGrou
21520 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  pBy->nExpr,.    
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21540 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
21550 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
21560 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73  O);.      j1 = s
21570 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
21580 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
21590 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
215a0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31  3(v, OP_Jump, j1
215b0 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20  +1, 0, j1+1);.. 
215c0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
215d0 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
215e0 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
215f0 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
21600 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20       ** Changes 
21610 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
21620 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
21630 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
21640 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
21650 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
21660 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
21670 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
21680 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
21690 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
216a0 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
216b0 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
216c0 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
216d0 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
216e0 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
216f0 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
21700 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
21710 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
21720 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
21730 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
21740 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
21750 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
21760 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
21770 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
21780 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
21790 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
217a0 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d  arse, iBMem, iAM
217b0 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
217c0 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
217d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
217e0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
217f0 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
21800 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
21810 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
21820 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
21830 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21840 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21850 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  _IfPos, iAbortFl
21860 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  ag, addrEnd);.  
21870 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
21880 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74  (v, "check abort
21890 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
218a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
218b0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
218c0 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
218d0 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
218e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65  omment((v, "rese
218f0 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  t accumulator"))
21900 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
21910 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  te the aggregate
21920 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61   accumulators ba
21930 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
21940 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  nt of.      ** t
21950 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20  he current row. 
21960 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
21970 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
21980 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20  e(v, j1);.      
21990 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
219a0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
219b0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
219c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
219d0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
219e0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
219f0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
21a00 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20   "indicate data 
21a10 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  in accumulator")
21a20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64  );..      /* End
21a30 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20   of the loop.   
21a40 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
21a50 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
21a60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21a70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
21a80 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
21a90 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
21aa0 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
21ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
21ac0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
21ad0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
21ae0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
21af0 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
21b00 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a 20  ortingIdx, 1);. 
21b10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
21b20 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
21b30 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
21b40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
21b50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21b60 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
21b70 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
21b80 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
21b90 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
21ba0 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
21bb0 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  row"));..      /
21bc0 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  * Jump over the 
21bd0 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20  subroutines.    
21be0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
21bf0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21c00 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
21c10 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  End);..      /* 
21c20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
21c30 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
21c40 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ts a single row 
21c50 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  of the result.  
21c60 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69      ** set.  Thi
21c70 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72  s subroutine fir
21c80 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  st looks at the 
21c90 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55  iUseFlag.  If iU
21ca0 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20  seFlag.      ** 
21cb0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
21cc0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
21cd0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73  he subroutine is
21ce0 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20   a no-op.  If.  
21cf0 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
21d00 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20  ssing calls for 
21d10 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f  the query to abo
21d20 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  rt, this subrout
21d30 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63  ine.      ** inc
21d40 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f  rements the iAbo
21d50 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f  rtFlag memory lo
21d60 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65  cation before re
21d70 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20  turning in.     
21d80 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67   ** order to sig
21d90 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  nal the caller t
21da0 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a  o abort..      *
21db0 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41  /.      addrSetA
21dc0 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  bort = sqlite3Vd
21dd0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
21de0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21df0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21e00 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f  Integer, 1, iAbo
21e10 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
21e20 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
21e30 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29  set abort flag")
21e40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21e50 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
21e60 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
21e70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71  utRow);.      sq
21e80 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
21e90 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74  Label(v, addrOut
21ea0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61  putRow);.      a
21eb0 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
21ec0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
21ed0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
21ee0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21ef0 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  2(v, OP_IfPos, i
21f00 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74  UseFlag, addrOut
21f10 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20  putRow+2);.     
21f20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
21f30 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74   "Groupby result
21f40 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79   generator entry
21f50 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20   point"));.     
21f60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21f70 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
21f80 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
21f90 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
21fa0 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
21fb0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
21fc0 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67       if( pHaving
21fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
21fe0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
21ff0 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
22000 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
22010 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
22020 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
22030 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
22040 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
22050 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70  >pEList, 0, 0, p
22060 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
22080 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
22090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220a0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
220b0 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62  Row+1, addrSetAb
220c0 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ort);.      sqli
220d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
220e0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
220f0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
22100 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
22110 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65   "end groupby re
22120 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29  sult generator")
22130 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
22140 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
22150 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73  ne that will res
22160 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20  et the group-by 
22170 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20  accumulator.    
22180 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
22190 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
221a0 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29  el(v, addrReset)
221b0 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  ;.      resetAcc
221c0 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
221d0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
221e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
221f0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
22200 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20  n, regReset);.  
22210 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64     .    } /* end
22220 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20  if pGroupBy */. 
22230 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
22240 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61  ExprList *pMinMa
22250 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70  x = 0;.      Exp
22260 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b  rList *pDel = 0;
22270 0a 20 20 20 20 20 20 75 38 20 66 6c 61 67 3b 0a  .      u8 flag;.
22280 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
22290 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  if the query is 
222a0 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  of one of the fo
222b0 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20  llowing forms:. 
222c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
222d0 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29     SELECT min(x)
222e0 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
222f0 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  **   SELECT max(
22300 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
22310 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
22320 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b   it is, then ask
22330 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65   the code in whe
22340 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20  re.c to attempt 
22350 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a  to sort results.
22360 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74        ** as if t
22370 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
22380 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44  ER ON x" or "ORD
22390 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c  ER ON x DESC" cl
223a0 61 75 73 65 2e 20 0a 20 20 20 20 20 20 2a 2a 20  ause. .      ** 
223b0 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62  If where.c is ab
223c0 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65  le to produce re
223d0 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20  sults sorted in 
223e0 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e  this order, then
223f0 0a 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64  .      ** add vd
22400 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b  be code to break
22410 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63   out of the proc
22420 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65  essing loop afte
22430 72 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  r the .      ** 
22440 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
22450 28 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74  (since the first
22460 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
22470 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20  e loop is .     
22480 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
22490 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
224a0 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69   row with the mi
224b0 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d  nimum or maximum
224c0 20 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65   .      ** value
224d0 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20   of x, the only 
224e0 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20  row required).. 
224f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
22500 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20   A special flag 
22510 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74  must be passed t
22520 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
22530 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c  gin() to slightl
22540 79 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66  y.      ** modif
22550 79 20 62 65 68 61 76 69 6f 75 72 20 61 73 20 66  y behaviour as f
22560 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a  ollows:.      **
22570 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66  .      **   + If
22580 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
22590 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c  "SELECT min(x)",
225a0 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63   then the loop c
225b0 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  oded by.      **
225c0 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f       where.c sho
225d0 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20  uld not iterate 
225e0 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20  over any values 
225f0 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75  with a NULL valu
22600 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66  e.      **     f
22610 6f 72 20 78 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  or x..      **. 
22620 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20       **   + The 
22630 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69  optimizer code i
22640 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20 74  n where.c (the t
22650 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64 65  hing that decide
22660 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a  s which.      **
22670 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e       index or in
22680 64 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68  dices to use) sh
22690 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66  ould place a dif
226a0 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20  ferent priority 
226b0 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  on .      **    
226c0 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20   satisfying the 
226d0 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73  'ORDER BY' claus
226e0 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69  e than it does i
226f0 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20  n other cases.. 
22700 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65       **     Refe
22710 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f  r to code and co
22720 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e  mments in where.
22730 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20  c for details.. 
22740 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6c       */.      fl
22750 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79  ag = minMaxQuery
22760 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  (p);.      if( f
22770 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  lag ){.        p
22780 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 20 3d 20  Del = pMinMax = 
22790 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
227a0 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
227b0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 70 4c  ->a[0].pExpr->pL
227c0 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ist);.        if
227d0 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62  ( pMinMax && !db
227e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
227f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e  {.          pMin
22800 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  Max->a[0].sortOr
22810 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52  der = flag!=WHER
22820 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  E_ORDERBY_MIN;. 
22830 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
22840 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
22850 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
22860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
22870 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
22880 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20  ase runs if the 
22890 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f  aggregate has no
228a0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
228b0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
228c0 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75  processing is mu
228d0 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65  ch simpler since
228e0 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61   there is only a
228f0 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20   single row.    
22900 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
22910 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
22920 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
22930 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
22940 6f 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  o);.      pWInfo
22950 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
22960 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
22970 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26  bList, pWhere, &
22980 70 4d 69 6e 4d 61 78 2c 20 66 6c 61 67 29 3b 0a  pMinMax, flag);.
22990 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
229a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
229b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
229c0 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
229d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
229e0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
229f0 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
22a00 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
22a10 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
22a20 20 20 20 69 66 28 20 21 70 4d 69 6e 4d 61 78 20     if( !pMinMax 
22a30 26 26 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  && flag ){.     
22a40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22a50 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
22a60 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65   0, pWInfo->iBre
22a70 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ak);.        Vdb
22a80 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
22a90 28 29 20 62 79 20 69 6e 64 65 78 22 2c 28 66 6c  () by index",(fl
22aa0 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag==WHERE_ORDERB
22ab0 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78  Y_MIN?"min":"max
22ac0 22 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ")));.      }.  
22ad0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
22ae0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
22af0 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
22b00 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
22b10 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
22b20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
22b30 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e        if( pHavin
22b40 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
22b50 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
22b60 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
22b70 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45   addrEnd, SQLITE
22b80 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
22b90 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65      }.      sele
22ba0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
22bb0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
22bc0 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a  , 0, 0, 0, -1, .
22bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22be0 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
22bf0 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a  rEnd, addrEnd);.
22c00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
22c10 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
22c20 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pDel);.    }.  
22c30 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
22c40 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
22c50 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
22c60 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
22c70 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f  te query */..  /
22c80 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
22c90 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
22ca0 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
22cb0 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
22cc0 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
22cd0 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
22ce0 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
22cf0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
22d00 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e  derBy ){.    gen
22d10 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
22d20 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69  arse, p, v, pELi
22d30 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74  st->nExpr, pDest
22d40 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
22d50 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
22d60 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20  his query.  */. 
22d70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
22d80 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64  lveLabel(v, iEnd
22d90 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c  );..  /* The SEL
22da0 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66  ECT was successf
22db0 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65  ully coded.   Se
22dc0 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
22dd0 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69  e to 0.  ** to i
22de0 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72  ndicate no error
22df0 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30  s..  */.  rc = 0
22e00 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
22e10 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
22e20 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
22e30 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
22e40 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
22e50 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
22e60 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
22e70 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a  */.select_end:..
22e80 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
22e90 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65  lumn names if re
22ea0 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c  sults of the SEL
22eb0 45 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75  ECT are to be ou
22ec0 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tput..  */.  if(
22ed0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22ee0 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  & pDest->eDest==
22ef0 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
22f00 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
22f10 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
22f20 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
22f30 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44  .  }..  sqlite3D
22f40 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
22f50 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  fo.aCol);.  sqli
22f60 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
22f70 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20  ggInfo.aFunc);. 
22f80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
22f90 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
22fa0 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a  E_DEBUG)./*.****
22fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
23000 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
23010 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
23020 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
23030 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63  ing only.  The c
23040 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66 6f 6c 6c  ode.** that foll
23050 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  ows does not app
23060 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20 62 75  ear in normal bu
23070 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  ilds..**.** Thes
23080 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
23090 73 65 64 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  sed to print out
230a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
230b0 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f 66 20 61  all or part of a
230c0 20 0a 2a 2a 20 70 61 72 73 65 20 73 74 72 75 63   .** parse struc
230d0 74 75 72 65 73 20 73 75 63 68 20 61 73 20 53 65  tures such as Se
230e0 6c 65 63 74 20 6f 72 20 45 78 70 72 2e 20 20 53  lect or Expr.  S
230f0 75 63 68 20 70 72 69 6e 74 6f 75 74 73 20 61 72  uch printouts ar
23100 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  e useful.** for 
23110 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e 64 65 72  helping to under
23120 73 74 61 6e 64 20 77 68 61 74 20 69 73 20 68 61  stand what is ha
23130 70 70 65 6e 69 6e 67 20 69 6e 73 69 64 65 20 74  ppening inside t
23140 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
23150 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20  r.** during the 
23160 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 6f 6d  execution of com
23170 70 6c 65 78 20 53 45 4c 45 43 54 20 73 74 61 74  plex SELECT stat
23180 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ements..**.** Th
23190 65 73 65 20 72 6f 75 74 69 6e 65 20 61 72 65 20  ese routine are 
231a0 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e 79 77 68  not called anywh
231b0 65 72 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ere from within 
231c0 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f  the normal.** co
231d0 64 65 20 62 61 73 65 2e 20 20 54 68 65 6e 20 61  de base.  Then a
231e0 72 65 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  re intended to b
231f0 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  e called from wi
23200 74 68 69 6e 20 74 68 65 20 64 65 62 75 67 67 65  thin the debugge
23210 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20 74 65 6d  r.** or from tem
23220 70 6f 72 61 72 79 20 22 70 72 69 6e 74 66 22 20  porary "printf" 
23230 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 65 72  statements inser
23240 74 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ted for debuggin
23250 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  g..*/.void sqlit
23260 65 33 50 72 69 6e 74 45 78 70 72 28 45 78 70 72  e3PrintExpr(Expr
23270 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
23280 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d 3e 74 6f 6b  oken.z && p->tok
23290 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71  en.n>0 ){.    sq
232a0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
232b0 28 22 28 25 2e 2a 73 22 2c 20 70 2d 3e 74 6f 6b  ("(%.*s", p->tok
232c0 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a  en.n, p->token.z
232d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
232e0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
232f0 74 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f 70 29  tf("(%d", p->op)
23300 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
23310 4c 65 66 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Left ){.    sqli
23320 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23330 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
23340 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 4c 65  PrintExpr(p->pLe
23350 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ft);.  }.  if( p
23360 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
23370 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23380 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c  tf(" ");.    sql
23390 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
233a0 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  >pRight);.  }.  
233b0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
233c0 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69 64 20  tf(")");.}.void 
233d0 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
233e0 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
233f0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
23400 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
23410 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
23420 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
23430 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69  tExpr(pList->a[i
23440 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
23450 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ( i<pList->nExpr
23460 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  -1 ){.      sqli
23470 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23480 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , ");.    }.  }.
23490 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72  }.void sqlite3Pr
234a0 69 6e 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74  intSelect(Select
234b0 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29   *p, int indent)
234c0 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  {.  sqlite3Debug
234d0 50 72 69 6e 74 66 28 22 25 2a 73 53 45 4c 45 43  Printf("%*sSELEC
234e0 54 28 25 70 29 20 22 2c 20 69 6e 64 65 6e 74 2c  T(%p) ", indent,
234f0 20 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74   "", p);.  sqlit
23500 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28  e3PrintExprList(
23510 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71  p->pEList);.  sq
23520 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23530 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70 2d  ("\n");.  if( p-
23540 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 63 68 61  >pSrc ){.    cha
23550 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20 20 20  r *zPrefix;.    
23560 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72 65 66  int i;.    zPref
23570 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20 20 20  ix = "FROM";.   
23580 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70   for(i=0; i<p->p
23590 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
235a0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
235b0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
235c0 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b  m = &p->pSrc->a[
235d0 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i];.      sqlite
235e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
235f0 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c 20 7a  s ", indent+6, z
23600 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20 7a  Prefix);.      z
23610 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20  Prefix = "";.   
23620 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
23630 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
23640 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23650 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20 20 20  ntf("(\n");.    
23660 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
23670 53 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e 70 53  Select(pItem->pS
23680 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b 31 30  elect, indent+10
23690 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
236a0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
236b0 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38 2c 20  *s)", indent+8, 
236c0 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  "");.      }else
236d0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   if( pItem->zNam
236e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
236f0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23700 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  "%s", pItem->zNa
23710 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
23720 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54     if( pItem->pT
23730 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
23740 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23750 28 22 28 74 61 62 6c 65 3a 20 25 73 29 22 2c 20  ("(table: %s)", 
23760 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
23770 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
23780 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
23790 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lias ){.        
237a0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
237b0 74 66 28 22 20 41 53 20 25 73 22 2c 20 70 49 74  tf(" AS %s", pIt
237c0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
237d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
237e0 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31  <p->pSrc->nSrc-1
237f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23800 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23810 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ,");.      }.   
23820 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23830 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
23840 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
23850 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71  pWhere ){.    sq
23860 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23870 28 22 25 2a 73 20 57 48 45 52 45 20 22 2c 20 69  ("%*s WHERE ", i
23880 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20  ndent, "");.    
23890 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
238a0 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  (p->pWhere);.   
238b0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
238c0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
238d0 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
238e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
238f0 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
23900 47 52 4f 55 50 20 42 59 20 22 2c 20 69 6e 64 65  GROUP BY ", inde
23910 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
23920 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
23930 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  t(p->pGroupBy);.
23940 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23950 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
23960 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69  }.  if( p->pHavi
23970 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ng ){.    sqlite
23980 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
23990 73 20 48 41 56 49 4e 47 20 22 2c 20 69 6e 64 65  s HAVING ", inde
239a0 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
239b0 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
239c0 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73  >pHaving);.    s
239d0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
239e0 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  f("\n");.  }.  i
239f0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
23a00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
23a10 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 4f 52  ugPrintf("%*s OR
23a20 44 45 52 20 42 59 20 22 2c 20 69 6e 64 65 6e 74  DER BY ", indent
23a30 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  , "");.    sqlit
23a40 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28  e3PrintExprList(
23a50 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
23a60 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23a70 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a  intf("\n");.  }.
23a80 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  }./* End of the 
23a90 73 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20  structure debug 
23aa0 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a  printing code.**
23ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e  ***********/.#en
23b00 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
23b10 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64  QLITE_TEST) || d
23b20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
23b30 42 55 47 29 20 2a 2f 0a                          BUG) */.