/ Hex Artifact Content
Login

Artifact b03c6fe474ded7bd110ca7b551bf0236133c12da:


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 38 34  select.c,v 1.484
0200: 20 32 30 30 38 2f 31 31 2f 31 32 20 31 32 3a 32   2008/11/12 12:2
0210: 37 3a 33 31 20 64 72 68 20 45 78 70 20 24 0a 2a  7:31 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 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  <sizeof(keywords
1060: 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64  )/sizeof(keyword
1070: 73 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  s[0]); j++){.   
1080: 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65 79     if( p->n==key
1090: 77 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61 72 20 0a  words[j].nChar .
10a0: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
10b0: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
10c0: 61 72 2a 29 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72  ar*)p->z, keywor
10d0: 64 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20  ds[j].zKeyword, 
10e0: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
10f0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1100: 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65  keywords[j].code
1110: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1130: 20 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66     if( j>=sizeof
1140: 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f  (keywords)/sizeo
1150: 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29  f(keywords[0]) )
1160: 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  {.      jointype
1170: 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20   |= JT_ERROR;.  
1180: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1190: 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20  .  }.  if(.     
11a0: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
11b0: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29  INNER|JT_OUTER))
11c0: 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  ==(JT_INNER|JT_O
11d0: 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a  UTER) ||.     (j
11e0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52  ointype & JT_ERR
11f0: 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  OR)!=0.  ){.    
1200: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20  const char *zSp 
1210: 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72  = " ";.    asser
1220: 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20  t( pB!=0 );.    
1230: 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70  if( pC==0 ){ zSp
1240: 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++; }.    sqlite
1250: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1260: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e  , "unknown or un
1270: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
1280: 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25  ype: ".       "%
1290: 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70  T %T%s%T", pA, p
12a0: 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20  B, zSp, pC);.   
12b0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
12c0: 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NNER;.  }else if
12d0: 28 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ( jointype & JT_
12e0: 52 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71 6c  RIGHT ){.    sql
12f0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1300: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
1310: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
1320: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
1330: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
1340: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
1350: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
1360: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
1370: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
1380: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1390: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
13a0: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
13b0: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
13c0: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
13d0: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
13e0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
13f0: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
1400: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
1410: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
1420: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1430: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
1440: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1450: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
1460: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
1470: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
1480: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
1490: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
14a0: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
14b0: 66 20 61 20 74 6f 6b 65 6e 20 74 6f 20 61 20 27  f a token to a '
14c0: 5c 30 30 30 27 2d 74 65 72 6d 69 6e 61 74 65 64  \000'-terminated
14d0: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
14e0: 69 63 20 76 6f 69 64 20 73 65 74 54 6f 6b 65 6e  ic void setToken
14f0: 28 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73 74  (Token *p, const
1500: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 70 2d 3e   char *z){.  p->
1510: 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a 20 20 70 2d  z = (u8*)z;.  p-
1520: 3e 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28  >n = z ? strlen(
1530: 7a 29 20 3a 20 30 3b 0a 20 20 70 2d 3e 64 79 6e  z) : 0;.  p->dyn
1540: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
1550: 65 74 20 74 68 65 20 74 6f 6b 65 6e 20 74 6f 20  et the token to 
1560: 74 68 65 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  the double-quote
1570: 64 20 61 6e 64 20 65 73 63 61 70 65 64 20 76 65  d and escaped ve
1580: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 72  rsion of the str
1590: 69 6e 67 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  ing pointed.** t
15a0: 6f 20 62 79 20 7a 2e 20 46 6f 72 20 65 78 61 6d  o by z. For exam
15b0: 70 6c 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 7b 61  ple;.**.**    {a
15c0: 22 62 63 7d 20 20 2d 3e 20 20 7b 22 61 22 22 62  "bc}  ->  {"a""b
15d0: 63 22 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  c"}.*/.static vo
15e0: 69 64 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65  id setQuotedToke
15f0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
1600: 20 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73 74   Token *p, const
1610: 20 63 68 61 72 20 2a 7a 29 7b 0a 0a 20 20 2f 2a   char *z){..  /*
1620: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 73 74   Check if the st
1630: 72 69 6e 67 20 61 70 70 65 61 72 73 20 74 6f 20  ring appears to 
1640: 62 65 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20  be quoted using 
1650: 22 2e 2e 2e 22 20 6f 72 20 60 2e 2e 2e 60 0a 20  "..." or `...`. 
1660: 20 2a 2a 20 6f 72 20 5b 2e 2e 2e 5d 20 6f 72 20   ** or [...] or 
1670: 27 2e 2e 2e 27 20 6f 72 20 69 66 20 74 68 65 20  '...' or if the 
1680: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20  string contains 
1690: 61 6e 79 20 22 20 63 68 61 72 61 63 74 65 72 73  any " characters
16a0: 2e 20 20 0a 20 20 2a 2a 20 49 66 20 69 74 20 64  .  .  ** If it d
16b0: 6f 65 73 2c 20 74 68 65 6e 20 72 65 63 6f 72 64  oes, then record
16c0: 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68   a version of th
16d0: 65 20 73 74 72 69 6e 67 20 77 69 74 68 20 74 68  e string with th
16e0: 65 20 73 70 65 63 69 61 6c 0a 20 20 2a 2a 20 63  e special.  ** c
16f0: 68 61 72 61 63 74 65 72 73 20 65 73 63 61 70 65  haracters escape
1700: 64 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  d..  */.  const 
1710: 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20  char *z2 = z;.  
1720: 69 66 28 20 2a 7a 32 21 3d 27 5b 27 20 26 26 20  if( *z2!='[' && 
1730: 2a 7a 32 21 3d 27 60 27 20 26 26 20 2a 7a 32 21  *z2!='`' && *z2!
1740: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 77 68 69  ='\'' ){.    whi
1750: 6c 65 28 20 2a 7a 32 20 29 7b 0a 20 20 20 20 20  le( *z2 ){.     
1760: 20 69 66 28 20 2a 7a 32 3d 3d 27 22 27 20 29 20   if( *z2=='"' ) 
1770: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7a 32 2b  break;.      z2+
1780: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
1790: 69 66 28 20 2a 7a 32 20 29 7b 0a 20 20 20 20 2f  if( *z2 ){.    /
17a0: 2a 20 53 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  * String contain
17b0: 73 20 22 20 63 68 61 72 61 63 74 65 72 73 20 2d  s " characters -
17c0: 20 63 6f 70 79 20 61 6e 64 20 71 75 6f 74 65 20   copy and quote 
17d0: 74 68 65 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 20  the string. */. 
17e0: 20 20 20 70 2d 3e 7a 20 3d 20 28 75 38 20 2a 29     p->z = (u8 *)
17f0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
1800: 50 61 72 73 65 2d 3e 64 62 2c 20 22 5c 22 25 77  Parse->db, "\"%w
1810: 5c 22 22 2c 20 7a 29 3b 0a 20 20 20 20 69 66 28  \"", z);.    if(
1820: 20 70 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 70   p->z ){.      p
1830: 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68  ->n = strlen((ch
1840: 61 72 20 2a 29 70 2d 3e 7a 29 3b 0a 20 20 20 20  ar *)p->z);.    
1850: 20 20 70 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20    p->dyn = 1;.  
1860: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1870: 20 2f 2a 20 53 74 72 69 6e 67 20 63 6f 6e 74 61   /* String conta
1880: 69 6e 73 20 6e 6f 20 22 20 63 68 61 72 61 63 74  ins no " charact
1890: 65 72 73 20 2d 20 63 6f 70 79 20 74 68 65 20 70  ers - copy the p
18a0: 6f 69 6e 74 65 72 2e 20 2a 2f 0a 20 20 20 20 70  ointer. */.    p
18b0: 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b 0a 20 20  ->z = (u8*)z;.  
18c0: 20 20 70 2d 3e 6e 20 3d 20 28 7a 32 20 2d 20 7a    p->n = (z2 - z
18d0: 29 3b 0a 20 20 20 20 70 2d 3e 64 79 6e 20 3d 20  );.    p->dyn = 
18e0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
18f0: 43 72 65 61 74 65 20 61 6e 20 65 78 70 72 65 73  Create an expres
1900: 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 6e  sion node for an
1910: 20 69 64 65 6e 74 69 66 69 65 72 20 77 69 74 68   identifier with
1920: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 7a 4e 61   the name of zNa
1930: 6d 65 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  me.*/.Expr *sqli
1940: 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28  te3CreateIdExpr(
1950: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1960: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1970: 29 7b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79  ){.  Token dummy
1980: 3b 0a 20 20 73 65 74 54 6f 6b 65 6e 28 26 64 75  ;.  setToken(&du
1990: 6d 6d 79 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  mmy, zName);.  r
19a0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 45 78  eturn sqlite3PEx
19b0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44  pr(pParse, TK_ID
19c0: 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d 79 29 3b  , 0, 0, &dummy);
19d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
19e0: 74 65 72 6d 20 74 6f 20 74 68 65 20 57 48 45 52  term to the WHER
19f0: 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  E expression in 
1a00: 2a 70 70 45 78 70 72 20 74 68 61 74 20 72 65 71  *ppExpr that req
1a10: 75 69 72 65 73 20 74 68 65 0a 2a 2a 20 7a 43 6f  uires the.** zCo
1a20: 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 65  l column to be e
1a30: 71 75 61 6c 20 69 6e 20 74 68 65 20 74 77 6f 20  qual in the two 
1a40: 74 61 62 6c 65 73 20 70 54 61 62 31 20 61 6e 64  tables pTab1 and
1a50: 20 70 54 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69   pTab2..*/.stati
1a60: 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54  c void addWhereT
1a70: 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
1a80: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
1a90: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1aa0: 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  xt */.  const ch
1ab0: 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 20 20 20  ar *zCol,       
1ac0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1ad0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73  column */.  cons
1ae0: 74 20 54 61 62 6c 65 20 2a 70 54 61 62 31 2c 20  t Table *pTab1, 
1af0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 61       /* First ta
1b00: 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ble */.  const c
1b10: 68 61 72 20 2a 7a 41 6c 69 61 73 31 2c 20 20 20  har *zAlias1,   
1b20: 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 66    /* Alias for f
1b30: 69 72 73 74 20 74 61 62 6c 65 2e 20 20 4d 61 79  irst table.  May
1b40: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f   be NULL */.  co
1b50: 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62 32  nst Table *pTab2
1b60: 2c 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64  ,      /* Second
1b70: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73   table */.  cons
1b80: 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 32 2c  t char *zAlias2,
1b90: 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f       /* Alias fo
1ba0: 72 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 2e 20  r second table. 
1bb0: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
1bc0: 20 20 69 6e 74 20 69 52 69 67 68 74 4a 6f 69 6e    int iRightJoin
1bd0: 54 61 62 6c 65 2c 20 20 20 20 20 2f 2a 20 56 44  Table,     /* VD
1be0: 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
1bf0: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f  e right table */
1c00: 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70 72  .  Expr **ppExpr
1c10: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ,           /* A
1c20: 64 64 20 74 68 65 20 65 71 75 61 6c 69 74 79 20  dd the equality 
1c30: 74 65 72 6d 20 74 6f 20 74 68 69 73 20 65 78 70  term to this exp
1c40: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
1c50: 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 20 20 20   isOuterJoin    
1c60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1c70: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
1c80: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 29   OUTER join */.)
1c90: 7b 0a 20 20 45 78 70 72 20 2a 70 45 31 61 2c 20  {.  Expr *pE1a, 
1ca0: 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b 0a 20 20  *pE1b, *pE1c;.  
1cb0: 45 78 70 72 20 2a 70 45 32 61 2c 20 2a 70 45 32  Expr *pE2a, *pE2
1cc0: 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45 78 70 72  b, *pE2c;.  Expr
1cd0: 20 2a 70 45 3b 0a 0a 20 20 70 45 31 61 20 3d 20   *pE;..  pE1a = 
1ce0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45  sqlite3CreateIdE
1cf0: 78 70 72 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  xpr(pParse, zCol
1d00: 29 3b 0a 20 20 70 45 32 61 20 3d 20 73 71 6c 69  );.  pE2a = sqli
1d10: 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28  te3CreateIdExpr(
1d20: 70 50 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20  pParse, zCol);. 
1d30: 20 69 66 28 20 7a 41 6c 69 61 73 31 3d 3d 30 20   if( zAlias1==0 
1d40: 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73 31 20 3d  ){.    zAlias1 =
1d50: 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65 3b 0a 20   pTab1->zName;. 
1d60: 20 7d 0a 20 20 70 45 31 62 20 3d 20 73 71 6c 69   }.  pE1b = sqli
1d70: 74 65 33 43 72 65 61 74 65 49 64 45 78 70 72 28  te3CreateIdExpr(
1d80: 70 50 61 72 73 65 2c 20 7a 41 6c 69 61 73 31 29  pParse, zAlias1)
1d90: 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 32 3d  ;.  if( zAlias2=
1da0: 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73  =0 ){.    zAlias
1db0: 32 20 3d 20 70 54 61 62 32 2d 3e 7a 4e 61 6d 65  2 = pTab2->zName
1dc0: 3b 0a 20 20 7d 0a 20 20 70 45 32 62 20 3d 20 73  ;.  }.  pE2b = s
1dd0: 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78  qlite3CreateIdEx
1de0: 70 72 28 70 50 61 72 73 65 2c 20 7a 41 6c 69 61  pr(pParse, zAlia
1df0: 73 32 29 3b 0a 20 20 70 45 31 63 20 3d 20 73 71  s2);.  pE1c = sq
1e00: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1e10: 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 31 62 2c  e, TK_DOT, pE1b,
1e20: 20 70 45 31 61 2c 20 30 29 3b 0a 20 20 70 45 32   pE1a, 0);.  pE2
1e30: 63 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  c = sqlite3PExpr
1e40: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
1e50: 20 70 45 32 62 2c 20 70 45 32 61 2c 20 30 29 3b   pE2b, pE2a, 0);
1e60: 0a 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33 50  .  pE = sqlite3P
1e70: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1e80: 45 51 2c 20 70 45 31 63 2c 20 70 45 32 63 2c 20  EQ, pE1c, pE2c, 
1e90: 30 29 3b 0a 20 20 69 66 28 20 70 45 20 26 26 20  0);.  if( pE && 
1ea0: 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20  isOuterJoin ){. 
1eb0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
1ec0: 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f  ty(pE, EP_FromJo
1ed0: 69 6e 29 3b 0a 20 20 20 20 70 45 2d 3e 69 52 69  in);.    pE->iRi
1ee0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69  ghtJoinTable = i
1ef0: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
1f00: 20 20 7d 0a 20 20 2a 70 70 45 78 70 72 20 3d 20    }.  *ppExpr = 
1f10: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
1f20: 50 61 72 73 65 2d 3e 64 62 2c 2a 70 70 45 78 70  Parse->db,*ppExp
1f30: 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, pE);.}../*.**
1f40: 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d   Set the EP_From
1f50: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e  Join property on
1f60: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
1f70: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
1f80: 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74  on..** And set t
1f90: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
1fa0: 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c  inTable to iTabl
1fb0: 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d  e for every term
1fc0: 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   in the.** expre
1fd0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ssion..**.** The
1fe0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
1ff0: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e  perty is used on
2000: 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70   terms of an exp
2010: 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a  ression to tell.
2020: 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45  ** the LEFT OUTE
2030: 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e  R JOIN processin
2040: 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69  g logic that thi
2050: 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f  s term is part o
2060: 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65  f the.** join re
2070: 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66  striction specif
2080: 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ied in the ON or
2090: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e   USING clause an
20a0: 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20  d not a part.** 
20b0: 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65  of the more gene
20c0: 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  ral WHERE clause
20d0: 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61  .  These terms a
20e0: 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f  re moved over to
20f0: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
2100: 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e  ause during join
2110: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20   processing but 
2120: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  we need to remem
2130: 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a  ber that they.**
2140: 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74   originated in t
2150: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
2160: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lause..**.** The
2170: 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
2180: 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20  Table tells the 
2190: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
21a0: 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68 65  cessing that the
21b0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
21c0: 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20  epends on table 
21d0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
21e0: 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61 62  even if that tab
21f0: 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70  le is not.** exp
2200: 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65  licitly mentione
2210: 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  d in the express
2220: 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72  ion.  That infor
2230: 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64  mation is needed
2240: 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69  .** for cases li
2250: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
2260: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2270: 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
2280: 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44  ON t1.a=t2.b AND
2290: 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68   t1.x=5.**.** Th
22a0: 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e  e where clause n
22b0: 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74 68  eeds to defer th
22c0: 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68  e handling of th
22d0: 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d  e t1.x=5.** term
22e0: 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65   until after the
22f0: 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20   t2 loop of the 
2300: 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77  join.  In that w
2310: 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32  ay, a.** NULL t2
2320: 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73   row will be ins
2330: 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  erted whenever t
2340: 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64  1.x!=5.  If we d
2350: 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74  o not.** defer t
2360: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
2370: 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62  1.x=5, it will b
2380: 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65  e processed imme
2390: 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72  diately.** after
23a0: 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64   the t1 loop and
23b0: 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21   rows with t1.x!
23c0: 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70  =5 will never ap
23d0: 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f  pear in.** the o
23e0: 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73 20  utput, which is 
23f0: 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74  incorrect..*/.st
2400: 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69  atic void setJoi
2410: 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69  nExpr(Expr *p, i
2420: 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68  nt iTable){.  wh
2430: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78  ile( p ){.    Ex
2440: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
2450: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
2460: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
2470: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
2480: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
2490: 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  p->pLeft, iTable
24a0: 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52  );.    p = p->pR
24b0: 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a  ight;.  } .}../*
24c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24d0: 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20 6a   processes the j
24e0: 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oin information 
24f0: 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74 61  for a SELECT sta
2500: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e  tement..** ON an
2510: 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2520: 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e  are converted in
2530: 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  to extra terms o
2540: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2550: 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20 6a  se..** NATURAL j
2560: 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74 65  oins also create
2570: 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c 61   extra WHERE cla
2580: 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  use terms..**.**
2590: 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20   The terms of a 
25a0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65 20  FROM clause are 
25b0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
25c0: 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74 72   Select.pSrc str
25d0: 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20 6c  ucture..** The l
25e0: 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft most table i
25f0: 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  s the first entr
2600: 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72 63  y in Select.pSrc
2610: 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
2620: 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74 68  t.** table is th
2630: 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20 54  e last entry.  T
2640: 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
2650: 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20   is held in the 
2660: 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65 20  entry to.** the 
2670: 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74 72  left.  Thus entr
2680: 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  y 0 contains the
2690: 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 66   join operator f
26a0: 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74 77  or the join betw
26b0: 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20 30  een.** entries 0
26c0: 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e 20   and 1.  Any ON 
26d0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
26e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
26f0: 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a   the join are.**
2700: 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20 74   also attached t
2710: 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72 79  o the left entry
2720: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2730: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
2740: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
2750: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
2760: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
2770: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 50  iteProcessJoin(P
2780: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
2790: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c  lect *p){.  SrcL
27a0: 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
27c0: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
27d0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
27e0: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2810: 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  rs */.  struct S
2820: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65  rcList_item *pLe
2830: 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74 20  ft;     /* Left 
2840: 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e  table being join
2850: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ed */.  struct S
2860: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52 69  rcList_item *pRi
2870: 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68 74  ght;    /* Right
2880: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
2890: 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20 3d  ned */..  pSrc =
28a0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65 66   p->pSrc;.  pLef
28b0: 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d 3b  t = &pSrc->a[0];
28c0: 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c 65  .  pRight = &pLe
28d0: 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ft[1];.  for(i=0
28e0: 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d 31  ; i<pSrc->nSrc-1
28f0: 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b 2c  ; i++, pRight++,
2900: 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20 54   pLeft++){.    T
2910: 61 62 6c 65 20 2a 70 4c 65 66 74 54 61 62 20 3d  able *pLeftTab =
2920: 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b 0a 20 20   pLeft->pTab;.  
2930: 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54    Table *pRightT
2940: 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61  ab = pRight->pTa
2950: 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74  b;.    int isOut
2960: 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65  er;..    if( pLe
2970: 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67  ftTab==0 || pRig
2980: 68 74 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69  htTab==0 ) conti
2990: 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72  nue;.    isOuter
29a0: 20 3d 20 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e   = (pRight->join
29b0: 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
29c0: 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  !=0;..    /* Whe
29d0: 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  n the NATURAL ke
29e0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
29f0: 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75  , add WHERE clau
2a00: 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20  se terms for.   
2a10: 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   ** every column
2a20: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61   that the two ta
2a30: 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d  bles have in com
2a40: 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mon..    */.    
2a50: 69 66 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e  if( pRight->join
2a60: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
2a70: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
2a80: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
2a90: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
2aa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2ab0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2ac0: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
2ad0: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
2ae0: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
2af0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2b00: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
2b10: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
2b20: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
2b30: 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e 43 6f 6c  j<pLeftTab->nCol
2b40: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2b50: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c  char *zName = pL
2b60: 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  eftTab->aCol[j].
2b70: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
2b80: 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  f( columnIndex(p
2b90: 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29  RightTab, zName)
2ba0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
2bb0: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
2bc0: 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65  arse, zName, pLe
2bd0: 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41  ftTab, pLeft->zA
2be0: 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20  lias, .         
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c 20       pRightTab, 
2c10: 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a  pRight->zAlias,.
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52                pR
2c40: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26  ight->iCursor, &
2c50: 70 2d 3e 70 57 68 65 72 65 2c 20 69 73 4f 75 74  p->pWhere, isOut
2c60: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a  er);.          .
2c70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c80: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2c90: 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e  Disallow both ON
2ca0: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
2cb0: 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a  es in the same j
2cc0: 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oin.    */.    i
2cd0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26  f( pRight->pOn &
2ce0: 26 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  & pRight->pUsing
2cf0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d00: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2d10: 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62  , "cannot have b
2d20: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
2d30: 20 22 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75   ".        "clau
2d40: 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ses in the same 
2d50: 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  join");.      re
2d60: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  turn 1;.    }.. 
2d70: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e     /* Add the ON
2d80: 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65   clause to the e
2d90: 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
2da0: 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65  clause, connecte
2db0: 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41  d by.    ** an A
2dc0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  ND operator..   
2dd0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
2de0: 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20  ht->pOn ){.     
2df0: 20 69 66 28 20 69 73 4f 75 74 65 72 20 29 20 73   if( isOuter ) s
2e00: 65 74 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68  etJoinExpr(pRigh
2e10: 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e  t->pOn, pRight->
2e20: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2e30: 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  p->pWhere = sqli
2e40: 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
2e50: 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65  e->db, p->pWhere
2e60: 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a  , pRight->pOn);.
2e70: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f        pRight->pO
2e80: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
2e90: 20 20 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72    /* Create extr
2ea0: 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57  a terms on the W
2eb0: 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
2ec0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
2ed0: 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  d.    ** in the 
2ee0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45  USING clause.  E
2ef0: 78 61 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74  xample: If the t
2f00: 77 6f 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  wo tables to be 
2f10: 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20  joined are .    
2f20: 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74  ** A and B and t
2f30: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
2f40: 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20  names X, Y, and 
2f50: 5a 2c 20 74 68 65 6e 20 61 64 64 20 74 68 69 73  Z, then add this
2f60: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57  .    ** to the W
2f70: 48 45 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20  HERE clause:    
2f80: 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d  A.X=B.X AND A.Y=
2f90: 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a  B.Y AND A.Z=B.Z.
2fa0: 20 20 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e      ** Report an
2fb0: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f   error if any co
2fc0: 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69  lumn mentioned i
2fd0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
2fe0: 73 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  se is.    ** not
2ff0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f   contained in bo
3000: 74 68 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  th tables to be 
3010: 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  joined..    */. 
3020: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3030: 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49  Using ){.      I
3040: 64 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  dList *pList = p
3050: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20  Right->pUsing;. 
3060: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3070: 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29  pList->nId; j++)
3080: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
3090: 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61  zName = pList->a
30a0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
30b0: 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64     if( columnInd
30c0: 65 78 28 70 4c 65 66 74 54 61 62 2c 20 7a 4e 61  ex(pLeftTab, zNa
30d0: 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75 6d 6e 49  me)<0 || columnI
30e0: 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20  ndex(pRightTab, 
30f0: 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20 20 20 20  zName)<0 ){.    
3100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3110: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
3120: 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e 67  annot join using
3130: 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f 6c   column %s - col
3140: 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20  umn ".          
3150: 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20 69    "not present i
3160: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c 20  n both tables", 
3170: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
3180: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3190: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
31a0: 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73  dWhereTerm(pPars
31b0: 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54  e, zName, pLeftT
31c0: 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61  ab, pLeft->zAlia
31d0: 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  s, .            
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f0: 70 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68  pRightTab, pRigh
3200: 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20  t->zAlias,.     
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3220: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 69         pRight->i
3230: 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65  Cursor, &p->pWhe
3240: 72 65 2c 20 69 73 4f 75 74 65 72 29 3b 0a 20 20  re, isOuter);.  
3250: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3260: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
3270: 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64 65  *.** Insert code
3280: 20 69 6e 74 6f 20 22 76 22 20 74 68 61 74 20 77   into "v" that w
3290: 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63  ill push the rec
32a0: 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  ord on the top o
32b0: 66 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  f the.** stack i
32c0: 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a  nto the sorter..
32d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
32e0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20  ushOntoSorter(. 
32f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3300: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
3310: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  r context */.  E
3320: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
3330: 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y,    /* The ORD
3340: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
3350: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
3360: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
3370: 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61  whole SELECT sta
3380: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
3390: 72 65 67 44 61 74 61 20 20 20 20 20 20 20 20 20  regData         
33a0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68     /* Register h
33b0: 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62  olding data to b
33c0: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29 7b 0a 20  e sorted */.){. 
33d0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
33e0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
33f0: 6e 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  nExpr = pOrderBy
3400: 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20 72  ->nExpr;.  int r
3410: 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33  egBase = sqlite3
3420: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
3430: 72 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20  rse, nExpr+2);. 
3440: 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d   int regRecord =
3450: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
3460: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
3470: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
3480: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
3490: 72 64 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c  rderBy, regBase,
34a0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
34b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
34c0: 65 71 75 65 6e 63 65 2c 20 70 4f 72 64 65 72 42  equence, pOrderB
34d0: 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67  y->iECursor, reg
34e0: 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20 73  Base+nExpr);.  s
34f0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
3500: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44 61  ve(pParse, regDa
3510: 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  ta, regBase+nExp
3520: 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  r+1, 1);.  sqlit
3530: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3540: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
3550: 65 67 42 61 73 65 2c 20 6e 45 78 70 72 20 2b 20  egBase, nExpr + 
3560: 32 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  2, regRecord);. 
3570: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3580: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
3590: 72 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  rt, pOrderBy->iE
35a0: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
35b0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  d);.  sqlite3Rel
35c0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
35d0: 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
35e0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
35f0: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
3600: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
3610: 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65  +2);.  if( pSele
3620: 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20  ct->iLimit ){.  
3630: 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64    int addr1, add
3640: 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d  r2;.    int iLim
3650: 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c  it;.    if( pSel
3660: 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ect->iOffset ){.
3670: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70        iLimit = p
3680: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b  Select->iOffset+
3690: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
36a0: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65      iLimit = pSe
36b0: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  lect->iLimit;.  
36c0: 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20 3d 20    }.    addr1 = 
36d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36e0: 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  1(v, OP_IfZero, 
36f0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c  iLimit);.    sql
3700: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3710: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c 69  , OP_AddImm, iLi
3720: 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64  mit, -1);.    ad
3730: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
3740: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
3750: 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  to);.    sqlite3
3760: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
3770: 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  addr1);.    sqli
3780: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
3790: 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65 72   OP_Last, pOrder
37a0: 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  By->iECursor);. 
37b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
37c0: 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
37d0: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  e, pOrderBy->iEC
37e0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  ursor);.    sqli
37f0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3800: 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 70  v, addr2);.    p
3810: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d  Select->iLimit =
3820: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
3830: 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70   Add code to imp
3840: 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45  lement the OFFSE
3850: 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  T.*/.static void
3860: 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56   codeOffset(.  V
3870: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
3880: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
3890: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a  e into this VM *
38a0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
38b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
38c0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
38d0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  ing coded */.  i
38e0: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20 20  nt iContinue    
38f0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
3900: 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65 6e   skip the curren
3910: 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20  t record */.){. 
3920: 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20   if( p->iOffset 
3930: 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  && iContinue!=0 
3940: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  ){.    int addr;
3950: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3960: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
3970: 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  Imm, p->iOffset,
3980: 20 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d   -1);.    addr =
3990: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
39a0: 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65 67 2c 20  p1(v, OP_IfNeg, 
39b0: 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  p->iOffset);.   
39c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
39d0: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
39e0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
39f0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
3a00: 2c 20 22 73 6b 69 70 20 4f 46 46 53 45 54 20 72  , "skip OFFSET r
3a10: 65 63 6f 72 64 73 22 29 29 3b 0a 20 20 20 20 73  ecords"));.    s
3a20: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
3a30: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d  re(v, addr);.  }
3a40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f  .}../*.** Add co
3a50: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63 68 65  de that will che
3a60: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
3a70: 74 68 65 20 4e 20 72 65 67 69 73 74 65 72 73 20  the N registers 
3a80: 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d 65 6d  starting at iMem
3a90: 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73 74 69  .** form a disti
3aa0: 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54 61 62  nct entry.  iTab
3ab0: 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20 69 6e   is a sorting in
3ac0: 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 70  dex that holds p
3ad0: 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65  reviously.** see
3ae0: 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f  n combinations o
3af0: 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73 2e 20  f the N values. 
3b00: 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   A new entry is 
3b10: 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20  made in iTab.** 
3b20: 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 4e  if the current N
3b30: 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 77 2e   values are new.
3b40: 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f  .**.** A jump to
3b50: 20 61 64 64 72 52 65 70 65 61 74 20 69 73 20 6d   addrRepeat is m
3b60: 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b 31 20  ade and the N+1 
3b70: 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70 70 65  values are poppe
3b80: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74  d from the.** st
3b90: 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70 20 4e  ack if the top N
3ba0: 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f   elements are no
3bb0: 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73  t distinct..*/.s
3bc0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 44  tatic void codeD
3bd0: 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72 73 65  istinct(.  Parse
3be0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
3bf0: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
3c00: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
3c10: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  text */.  int iT
3c20: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
3c30: 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  A sorting index 
3c40: 75 73 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72  used to test for
3c50: 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f   distinctness */
3c60: 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70 65 61  .  int addrRepea
3c70: 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  t,    /* Jump to
3c80: 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64 69 73   here if not dis
3c90: 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e  tinct */.  int N
3ca0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3cb0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
3cc0: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65  nts */.  int iMe
3cd0: 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m           /* F
3ce0: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  irst element */.
3cf0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
3d00: 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70  int r1;..  v = p
3d10: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
3d20: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
3d30: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
3d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3d50: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
3d60: 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72  cord, iMem, N, r
3d70: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
3d80: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 6f  eAddOp3(v, OP_Fo
3d90: 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72 52  und, iTab, addrR
3da0: 65 70 65 61 74 2c 20 72 31 29 3b 0a 20 20 73 71  epeat, r1);.  sq
3db0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3dc0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
3dd0: 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71   iTab, r1);.  sq
3de0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
3df0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
3e00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
3e10: 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
3e20: 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43  age when a SELEC
3e30: 54 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e  T is used within
3e40: 20 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e   a subexpression
3e50: 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22  .** (example:  "
3e60: 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  a IN (SELECT * F
3e70: 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74  ROM table)") but
3e80: 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61   it has more tha
3e90: 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f  n 1 result.** co
3ea0: 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69  lumn.  We do thi
3eb0: 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e  s in a subroutin
3ec0: 65 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72  e because the er
3ed0: 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 6d 75  ror occurs in mu
3ee0: 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c 61 63 65 73  ltiple.** places
3ef0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3f00: 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c  checkForMultiCol
3f10: 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a  umnSelectError(.
3f20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3f30: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
3f40: 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65  context. */.  Se
3f50: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
3f60: 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
3f70: 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75  n of SELECT resu
3f80: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  lts */.  int nEx
3f90: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pr            /*
3fa0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
3fb0: 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  t columns return
3fc0: 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a  ed by SELECT */.
3fd0: 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  ){.  int eDest =
3fe0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
3ff0: 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20   if( nExpr>1 && 
4000: 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20  (eDest==SRT_Mem 
4010: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65  || eDest==SRT_Se
4020: 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  t) ){.    sqlite
4030: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4040: 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  , "only a single
4050: 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20   result allowed 
4060: 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61 20  for ".       "a 
4070: 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20 70  SELECT that is p
4080: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
4090: 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  sion");.    retu
40a0: 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 1;.  }else{. 
40b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
40c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
40d0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
40e0: 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68   the code for th
40f0: 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20  e inside of the 
4100: 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66  inner loop.** of
4110: 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a   a SELECT..**.**
4120: 20 49 66 20 73 72 63 54 61 62 20 61 6e 64 20 6e   If srcTab and n
4130: 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f 74 68 20  Column are both 
4140: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
4150: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
4160: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
4170: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
4180: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
4190: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 6e 43  this row.  If nC
41a0: 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68 65 6e 20  olumn>0.** then 
41b0: 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66  data is pulled f
41c0: 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70  rom srcTab and p
41d0: 45 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e  EList is used on
41e0: 6c 79 20 74 6f 20 67 65 74 20 74 68 65 0a 2a 2a  ly to get the.**
41f0: 20 64 61 74 61 74 79 70 65 73 20 66 6f 72 20 65   datatypes for e
4200: 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73  ach column..*/.s
4210: 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63  tatic void selec
4220: 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61  tInnerLoop(.  Pa
4230: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4240: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
4250: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
4260: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
4270: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4280: 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74 20  complete select 
4290: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
42a0: 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  coded */.  ExprL
42b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
42c0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61     /* List of va
42d0: 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74 72 61  lues being extra
42e0: 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72  cted */.  int sr
42f0: 63 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  cTab,           
4300: 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66    /* Pull data f
4310: 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65 20 2a  rom this table *
4320: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
4330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4340: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
4350: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 74   in the source t
4360: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
4370: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
4380: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
4390: 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75  , sort results u
43a0: 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f  sing this key */
43b0: 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74 2c  .  int distinct,
43c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
43d0: 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75 72 65 20   >=0, make sure 
43e0: 72 65 73 75 6c 74 73 20 61 72 65 20 64 69 73 74  results are dist
43f0: 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  inct */.  Select
4400: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
4410: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
4420: 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
4430: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ts */.  int iCon
4440: 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20  tinue,          
4450: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
4460: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
4470: 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  xt row */.  int 
4480: 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
4490: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
44a0: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
44b0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
44c0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
44d0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
44e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
44f0: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
4500: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
4510: 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
4520: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
4530: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c  /.  int regResul
4540: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4550: 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f  /* Start of memo
4560: 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  ry holding resul
4570: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 65  t set */.  int e
4580: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
4590: 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f  est;   /* How to
45a0: 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75   dispose of resu
45b0: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  lts */.  int iPa
45c0: 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 50 61 72  rm = pDest->iPar
45d0: 6d 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72  m;   /* First ar
45e0: 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73  gument to dispos
45f0: 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69  al method */.  i
4600: 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20  nt nResultCol;  
4610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4620: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
4630: 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 69 66 28  olumns */..  if(
4640: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
4650: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
4660: 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74  !=0 );.  hasDist
4670: 69 6e 63 74 20 3d 20 64 69 73 74 69 6e 63 74 3e  inct = distinct>
4680: 3d 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  =0;.  if( pOrder
4690: 42 79 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  By==0 && !hasDis
46a0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64  tinct ){.    cod
46b0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43  eOffset(v, p, iC
46c0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20  ontinue);.  }.. 
46d0: 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71   /* Pull the req
46e0: 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  uested columns..
46f0: 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43 6f 6c 75    */.  if( nColu
4700: 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  mn>0 ){.    nRes
4710: 75 6c 74 43 6f 6c 20 3d 20 6e 43 6f 6c 75 6d 6e  ultCol = nColumn
4720: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
4730: 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69  ResultCol = pELi
4740: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20  st->nExpr;.  }. 
4750: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d   if( pDest->iMem
4760: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 65 73 74  ==0 ){.    pDest
4770: 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
4780: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 44 65  >nMem+1;.    pDe
4790: 73 74 2d 3e 6e 4d 65 6d 20 3d 20 6e 52 65 73 75  st->nMem = nResu
47a0: 6c 74 43 6f 6c 3b 0a 20 20 20 20 70 50 61 72 73  ltCol;.    pPars
47b0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
47c0: 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  ltCol;.  }else i
47d0: 66 28 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 21 3d  f( pDest->nMem!=
47e0: 6e 52 65 73 75 6c 74 43 6f 6c 20 29 7b 0a 20 20  nResultCol ){.  
47f0: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
4800: 73 20 77 68 65 6e 20 74 77 6f 20 53 45 4c 45 43  s when two SELEC
4810: 54 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  Ts of a compound
4820: 20 53 45 4c 45 43 54 20 68 61 76 65 20 64 69 66   SELECT have dif
4830: 66 65 72 69 6e 67 0a 20 20 20 20 2a 2a 20 6e 75  fering.    ** nu
4840: 6d 62 65 72 73 20 6f 66 20 72 65 73 75 6c 74 20  mbers of result 
4850: 63 6f 6c 75 6d 6e 73 2e 20 20 54 68 65 20 65 72  columns.  The er
4860: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
4870: 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 62 79   be generated by
4880: 0a 20 20 20 20 2a 2a 20 61 20 68 69 67 68 65 72  .    ** a higher
4890: 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 2e 20  -level routine. 
48a0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
48b0: 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d   }.  regResult =
48c0: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3b 0a 20 20   pDest->iMem;.  
48d0: 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b  if( nColumn>0 ){
48e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
48f0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4910: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
4920: 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20  umn, srcTab, i, 
4930: 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20  regResult+i);.  
4940: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
4950: 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74  eDest!=SRT_Exist
4960: 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  s ){.    /* If t
4970: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
4980: 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29  s an EXISTS(...)
4990: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
49a0: 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76   actual.    ** v
49b0: 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62  alues returned b
49c0: 79 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  y the SELECT are
49d0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
49e0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
49f0: 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
4a00: 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
4a10: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 65 44 65  , regResult, eDe
4a20: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29 3b  st==SRT_Output);
4a30: 0a 20 20 7d 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d  .  }.  nColumn =
4a40: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20   nResultCol;..  
4a50: 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49 4e  /* If the DISTIN
4a60: 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70  CT keyword was p
4a70: 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45  resent on the SE
4a80: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20  LECT statement. 
4a90: 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77   ** and this row
4aa0: 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62   has been seen b
4ab0: 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e  efore, then do n
4ac0: 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77  ot make this row
4ad0: 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  .  ** part of th
4ae0: 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20  e result..  */. 
4af0: 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63 74   if( hasDistinct
4b00: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4b10: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
4b20: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d   assert( pEList-
4b30: 3e 6e 45 78 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20  >nExpr==nColumn 
4b40: 29 3b 0a 20 20 20 20 63 6f 64 65 44 69 73 74 69  );.    codeDisti
4b50: 6e 63 74 28 70 50 61 72 73 65 2c 20 64 69 73 74  nct(pParse, dist
4b60: 69 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  inct, iContinue,
4b70: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 73   nColumn, regRes
4b80: 75 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  ult);.    if( pO
4b90: 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
4ba0: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
4bb0: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   p, iContinue);.
4bc0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
4bd0: 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
4be0: 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
4bf0: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70  pParse, pDest, p
4c00: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
4c10: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
4c20: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
4c30: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
4c40: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
4c50: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
4c60: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
4c70: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
4c80: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
4c90: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
4ca0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
4cb0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20  POUND_SELECT.   
4cc0: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
4cd0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
4ce0: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
4cf0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
4d00: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
4d10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4d20: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4d30: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
4d40: 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  umn, r1);.      
4d50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4d60: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
4d70: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
4d80: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
4d90: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
4da0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
4db0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
4dc0: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
4dd0: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
4de0: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
4df0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
4e00: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
4e10: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
4e20: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
4e30: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
4e40: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
4e50: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
4e60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4e70: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
4e80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4e90: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
4ea0: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
4eb0: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
4ec0: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
4ed0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
4ee0: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
4ef0: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
4f00: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
4f10: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
4f20: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
4f30: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
4f40: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
4f50: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
4f60: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
4f70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4f80: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4f90: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
4fa0: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  sult, nColumn, r
4fb0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  1);.      if( pO
4fc0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
4fd0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
4fe0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
4ff0: 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  y, p, r1);.     
5000: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5010: 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
5020: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
5030: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
5040: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5050: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
5060: 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
5070: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5080: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
5090: 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  , iParm, r1, r2)
50a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
50b0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
50c0: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
50d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
50e0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
50f0: 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
5100: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
5110: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
5120: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
5130: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5140: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5150: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
5160: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
5170: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
5180: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
5190: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
51a0: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
51b0: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
51c0: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
51d0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
51e0: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
51f0: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
5200: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
5210: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
5220: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
5230: 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  et: {.      asse
5240: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
5250: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e  ;.      p->affin
5260: 69 74 79 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  ity = sqlite3Com
5270: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
5280: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
5290: 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79   pDest->affinity
52a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
52b0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
52c0: 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61   /* At first gla
52d0: 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68  nce you would th
52e0: 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74  ink we could opt
52f0: 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20  imize out the.  
5300: 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
5310: 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73  Y in this case s
5320: 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f  ince the order o
5330: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
5340: 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   set.        ** 
5350: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e  does not matter.
5360: 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68    But there migh
5370: 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  t be a LIMIT cla
5380: 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20  use, in which.  
5390: 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68        ** case th
53a0: 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74  e order does mat
53b0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ter */.        p
53c0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
53d0: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
53e0: 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  p, regResult);. 
53f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5400: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
5410: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5420: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
5430: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5440: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
5450: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31  rd, regResult, 1
5460: 2c 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69  , r1, &p->affini
5470: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ty, 1);.        
5480: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
5490: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
54a0: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
54b0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
54c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
54d0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
54e0: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
54f0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5500: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5510: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r1);.      }.
5520: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5530: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
5540: 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
5550: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
5560: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
5570: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
5580: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
5590: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
55a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
55b0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
55c0: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
55d0: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
55e0: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
55f0: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
5600: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
5610: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
5620: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
5630: 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
5640: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
5650: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
5660: 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
5670: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
5680: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
5690: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
56a0: 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
56b0: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
56c0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
56d0: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
56e0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
56f0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
5700: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
5710: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
5720: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
5730: 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75  erBy, p, regResu
5740: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lt);.      }else
5750: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5760: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
5770: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
5780: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
5790: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
57a0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
57b0: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
57c0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
57d0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
57e0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
57f0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
5800: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
5810: 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68  ..    /* Send th
5820: 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61  e data to the ca
5830: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
5840: 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  or to a subrouti
5850: 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20  ne.  In the.    
5860: 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62  ** case of a sub
5870: 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62  routine, the sub
5880: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69  routine itself i
5890: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
58a0: 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67  r.    ** popping
58b0: 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74   the data from t
58c0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f  he stack..    */
58d0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
58e0: 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73  routine:.    cas
58f0: 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a  e SRT_Output: {.
5900: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
5910: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  By ){.        in
5920: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
5930: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5940: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5950: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5960: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
5970: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
5980: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 70  , r1);.        p
5990: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
59a0: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
59b0: 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  p, r1);.        
59c0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
59d0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
59e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
59f0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  f( eDest==SRT_Co
5a00: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
5a10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5a20: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
5a30: 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b  , pDest->iParm);
5a40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5a50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5a60: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
5a70: 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75  sultRow, regResu
5a80: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  lt, nColumn);.  
5a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5aa0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
5ab0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
5ac0: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29  Result, nColumn)
5ad0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5ae0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
5af0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
5b00: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a  E_OMIT_TRIGGER).
5b10: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
5b20: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
5b30: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
5b40: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
5b50: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
5b60: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
5b70: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
5b80: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
5b90: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
5ba0: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
5bb0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
5bc0: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
5bd0: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
5be0: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
5bf0: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
5c00: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
5c10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
5c20: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
5c30: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
5c40: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
5c50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
5c60: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
5c70: 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
5c80: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
5c90: 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
5ca0: 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hed..  */.  if( 
5cb0: 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
5cc0: 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
5cd0: 79 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 66 20 74  y==0 );  /* If t
5ce0: 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
5cf0: 20 42 59 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f   BY, the call to
5d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
5d20: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29  pushOntoSorter()
5d30: 20 77 6f 75 6c 64 20 68 61 76 65 20 63 6c 65 61   would have clea
5d40: 72 65 64 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f  red p->iLimit */
5d50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5d60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
5d70: 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  Imm, p->iLimit, 
5d80: 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
5d90: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
5da0: 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  _IfZero, p->iLim
5db0: 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d  it, iBreak);.  }
5dc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
5dd0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
5de0: 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b  st, generate a K
5df0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5e00: 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a   that records.**
5e10: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
5e20: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
5e30: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
5e40: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  hat expression l
5e50: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ist..**.** If th
5e60: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e  e ExprList is an
5e70: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
5e80: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68 65  UP BY clause the
5e90: 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a  n the resulting.
5ea0: 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ** KeyInfo struc
5eb0: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
5ec0: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
5ed0: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69  zing a virtual i
5ee0: 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  ndex to.** imple
5ef0: 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65  ment that clause
5f00: 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  .  If the ExprLi
5f10: 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  st is the result
5f20: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
5f30: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79  .** then the Key
5f40: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
5f50: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
5f60: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
5f70: 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65   virtual.** inde
5f80: 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  x to implement a
5f90: 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a   DISTINCT test..
5fa0: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
5fb0: 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  old the KeyInfo 
5fc0: 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74  structure is obt
5fd0: 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ain from malloc.
5fe0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a    The calling.**
5ff0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
6000: 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65  ponsible for see
6010: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
6020: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
6030: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 20  ually.** freed. 
6040: 20 41 64 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   Add the KeyInfo
6050: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68   structure to th
6060: 65 20 50 34 20 66 69 65 6c 64 20 6f 66 20 61 6e  e P4 field of an
6070: 20 6f 70 63 6f 64 65 20 75 73 69 6e 67 0a 2a 2a   opcode using.**
6080: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
6090: 4f 46 46 20 69 73 20 74 68 65 20 75 73 75 61 6c  OFF is the usual
60a0: 20 77 61 79 20 6f 66 20 64 65 61 6c 69 6e 67 20   way of dealing 
60b0: 77 69 74 68 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  with this..*/.st
60c0: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
60d0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
60e0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
60f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
6100: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
6110: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
6120: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65   int nExpr;.  Ke
6130: 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20  yInfo *pInfo;.  
6140: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
6150: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
6160: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
6170: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
6180: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33   pInfo = sqlite3
6190: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
61a0: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 66 6f 29 20   sizeof(*pInfo) 
61b0: 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f 66 28  + nExpr*(sizeof(
61c0: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29 3b 0a  CollSeq*)+1) );.
61d0: 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20    if( pInfo ){. 
61e0: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
61f0: 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 49 6e  rder = (u8*)&pIn
6200: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d  fo->aColl[nExpr]
6210: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 46 69  ;.    pInfo->nFi
6220: 65 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20  eld = nExpr;.   
6230: 20 70 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e   pInfo->enc = EN
6240: 43 28 64 62 29 3b 0a 20 20 20 20 66 6f 72 28 69  C(db);.    for(i
6250: 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
6260: 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  >a; i<nExpr; i++
6270: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
6280: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
6290: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
62a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
62b0: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
62c0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
62d0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
62e0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
62f0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
6300: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f     }.      pInfo
6310: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
6320: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
6330: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
6340: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
6350: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
6360: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
6370: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
6380: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
6390: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
63a0: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
63b0: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
63c0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
63d0: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
63e0: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
63f0: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
6400: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
6410: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
6420: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
6430: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
6440: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
6450: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
6460: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
6470: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
6480: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
6490: 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61  teSortTail(.  Pa
64a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
64b0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
64c0: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
64d0: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
64e0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
64f0: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20  t */.  Vdbe *v, 
6500: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
6510: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
6520: 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e  his VDBE */.  in
6530: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
6540: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
6550: 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a  umns of data */.
6560: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
6570: 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65  est /* Write the
6580: 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20   sorted results 
6590: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
65a0: 20 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64   brk = sqlite3Vd
65b0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
65c0: 20 20 69 6e 74 20 63 6f 6e 74 20 3d 20 73 71 6c    int cont = sql
65d0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
65e0: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 61 64 64 72  l(v);.  int addr
65f0: 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
6600: 69 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d 20  int pseudoTab = 
6610: 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  0;.  ExprList *p
6620: 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
6630: 64 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44  derBy;..  int eD
6640: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
6650: 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20  st;.  int iParm 
6660: 3d 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 3b 0a  = pDest->iParm;.
6670: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20  .  int regRow;. 
6680: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a   int regRowid;..
6690: 20 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42    iTab = pOrderB
66a0: 79 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69  y->iECursor;.  i
66b0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
66c0: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
66d0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
66e0: 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20      pseudoTab = 
66f0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
6700: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6710: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e  ddOp2(v, OP_SetN
6720: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 6e 43  umColumns, 0, nC
6730: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 73 71 6c 69  olumn);.    sqli
6740: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6750: 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
6760: 70 73 65 75 64 6f 54 61 62 2c 20 65 44 65 73 74  pseudoTab, eDest
6770: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29 3b 0a 20  ==SRT_Output);. 
6780: 20 7d 0a 20 20 61 64 64 72 20 3d 20 31 20 2b 20   }.  addr = 1 + 
6790: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
67a0: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54  2(v, OP_Sort, iT
67b0: 61 62 2c 20 62 72 6b 29 3b 0a 20 20 63 6f 64 65  ab, brk);.  code
67c0: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 63 6f 6e  Offset(v, p, con
67d0: 74 29 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20 73  t);.  regRow = s
67e0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
67f0: 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 52  (pParse);.  regR
6800: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
6810: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
6820: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
6830: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
6840: 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72  mn, iTab, pOrder
6850: 42 79 2d 3e 6e 45 78 70 72 20 2b 20 31 2c 20 72  By->nExpr + 1, r
6860: 65 67 52 6f 77 29 3b 0a 20 20 73 77 69 74 63 68  egRow);.  switch
6870: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63  ( eDest ){.    c
6880: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
6890: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
68a0: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71  mTab: {.      sq
68b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
68c0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
68d0: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29  iParm, regRowid)
68e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
68f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6900: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
6910: 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29  egRow, regRowid)
6920: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6930: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
6940: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
6950: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6960: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
6970: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
6980: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
6990: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
69a0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
69b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
69c0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
69d0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
69e0: 20 31 2c 20 72 65 67 52 6f 77 69 64 2c 20 26 70   1, regRowid, &p
69f0: 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a  ->affinity, 1);.
6a00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6a10: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
6a20: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
6a30: 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  Row, 1);.      s
6a40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6a50: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
6a60: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
6a70: 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
6a80: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
6a90: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
6aa0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
6ab0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
6ac0: 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
6ad0: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
6ae0: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
6af0: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
6b00: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
6b10: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
6b20: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
6b30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
6b40: 66 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f  f.    case SRT_O
6b50: 75 74 70 75 74 3a 0a 20 20 20 20 63 61 73 65 20  utput:.    case 
6b60: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
6b70: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
6b80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6b90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6ba0: 67 65 72 2c 20 31 2c 20 72 65 67 52 6f 77 69 64  ger, 1, regRowid
6bb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6bc0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6bd0: 5f 49 6e 73 65 72 74 2c 20 70 73 65 75 64 6f 54  _Insert, pseudoT
6be0: 61 62 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52  ab, regRow, regR
6bf0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  owid);.      for
6c00: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
6c10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   i++){.        a
6c20: 73 73 65 72 74 28 20 72 65 67 52 6f 77 21 3d 70  ssert( regRow!=p
6c30: 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 20 29 3b 0a  Dest->iMem+i );.
6c40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6c50: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6c60: 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61  Column, pseudoTa
6c70: 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e 69 4d 65  b, i, pDest->iMe
6c80: 6d 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  m+i);.      }.  
6c90: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
6ca0: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
6cb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6cc0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
6cd0: 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69  ultRow, pDest->i
6ce0: 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Mem, nColumn);. 
6cf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6d00: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
6d10: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44  hange(pParse, pD
6d20: 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75  est->iMem, nColu
6d30: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
6d40: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6d50: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6d60: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
6d70: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  iParm);.      }.
6d80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6d90: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6da0: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
6db0: 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
6dc0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
6dd0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
6de0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
6df0: 72 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74  regRow);.  sqlit
6e00: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
6e10: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69  (pParse, regRowi
6e20: 64 29 3b 0a 0a 20 20 2f 2a 20 4c 49 4d 49 54 20  d);..  /* LIMIT 
6e30: 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65  has been impleme
6e40: 6e 74 65 64 20 62 79 20 74 68 65 20 70 75 73 68  nted by the push
6e50: 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20 72 6f 75  OntoSorter() rou
6e60: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tine..  */.  ass
6e70: 65 72 74 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d  ert( p->iLimit==
6e80: 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62  0 );..  /* The b
6e90: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
6ea0: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
6eb0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
6ec0: 28 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c  (v, cont);.  sql
6ed0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6ee0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
6ef0: 20 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65   addr);.  sqlite
6f00: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
6f10: 6c 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28  l(v, brk);.  if(
6f20: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
6f30: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
6f40: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
6f50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6f60: 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
6f70: 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a   pseudoTab, 0);.
6f80: 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65    }..}../*.** Re
6f90: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6fa0: 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61  o a string conta
6fb0: 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61  ining the 'decla
6fc0: 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20  ration type' of 
6fd0: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
6fe0: 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72  n pExpr. The str
6ff0: 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74  ing may be treat
7000: 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20  ed as static by 
7010: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
7020: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
7030: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
7040: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
7050: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
7060: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
7070: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
7080: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
7090: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
70a0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
70b0: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
70c0: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
70d0: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
70e0: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
70f0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
7100: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
7110: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
7120: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
7130: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
7140: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
7150: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
7160: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
7170: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
7180: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
7190: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
71a0: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
71b0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
71c0: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
71d0: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
71e0: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
71f0: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
7200: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
7210: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
7220: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
7230: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
7240: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
7250: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
7260: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
7270: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
7280: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
7290: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  n is NULL..*/.st
72a0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
72b0: 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20 4e  *columnType(.  N
72c0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
72d0: 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
72e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
72f0: 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63 6f  pzOriginDb,.  co
7300: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
7310: 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  ginTab,.  const 
7320: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 43  char **pzOriginC
7330: 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  ol.){.  char con
7340: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
7350: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
7360: 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63 68  iginDb = 0;.  ch
7370: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69  ar const *zOrigi
7380: 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  nTab = 0;.  char
7390: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 43   const *zOriginC
73a0: 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  ol = 0;.  int j;
73b0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
73c0: 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  || pNC->pSrcList
73d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
73e0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
73f0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
7400: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
7410: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
7420: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  MN: {.      /* T
7430: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
7440: 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74   a column. Locat
7450: 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20  e the table the 
7460: 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a  column is being.
7470: 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74        ** extract
7480: 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43  ed from in NameC
7490: 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e  ontext.pSrcList.
74a0: 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20   This table may 
74b0: 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a  be real.      **
74c0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
74d0: 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20  or a subquery.. 
74e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
74f0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
7500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
7510: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c  le structure col
7520: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
7530: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53   from */.      S
7540: 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20  elect *pS = 0;  
7550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
7560: 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lect the column 
7570: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
7580: 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  m */.      int i
7590: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
75a0: 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20  lumn;  /* Index 
75b0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61  of column in pTa
75c0: 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65  b */.      while
75d0: 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29  ( pNC && !pTab )
75e0: 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73  {.        SrcLis
75f0: 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e  t *pTabList = pN
7600: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
7610: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70       for(j=0;j<p
7620: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26  TabList->nSrc &&
7630: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
7640: 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e  iCursor!=pExpr->
7650: 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20  iTable;j++);.   
7660: 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c       if( j<pTabL
7670: 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  ist->nSrc ){.   
7680: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
7690: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
76a0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 20  b;.          pS 
76b0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
76c0: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
76d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
76e0: 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e     pNC = pNC->pN
76f0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
7700: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
7710: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
7720: 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 0a       /* FIX ME:.
7730: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
7740: 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79 6f  can occurs if yo
7750: 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e 67  u have something
7760: 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e 65   like "SELECT ne
7770: 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20 20  w.x;" inside.   
7780: 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
7790: 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
77a0: 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65 72  ds, if you refer
77b0: 65 6e 63 65 20 74 68 65 20 73 70 65 63 69 61 6c  ence the special
77c0: 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20 2a   "new".        *
77d0: 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 72  * table in the r
77e0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 73  esult set of a s
77f0: 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e 6f  elect.  We do no
7800: 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77 61  t have a good wa
7810: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  y.        ** to 
7820: 66 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20  find the actual 
7830: 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20 63  table type, so c
7840: 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20 20  all it "TEXT".  
7850: 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a 20  This is really. 
7860: 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74 68         ** someth
7870: 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62 75  ing of a bug, bu
7880: 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20  t I do not know 
7890: 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a 20  how to fix it.. 
78a0: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
78b0: 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64    ** This code d
78c0: 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65 20  oes not produce 
78d0: 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
78e0: 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72 65  er - it just pre
78f0: 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  vents.        **
7900: 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53 65   a segfault.  Se
7910: 65 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e 0a  e ticket #1229..
7920: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
7930: 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58 54     zType = "TEXT
7940: 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";.        break
7950: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
7960: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 29 3b   assert( pTab );
7970: 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b  .      if( pS ){
7980: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
7990: 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61  "table" is actua
79a0: 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74  lly a sub-select
79b0: 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68   or a view in th
79c0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
79d0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
79e0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
79f0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
7a00: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
7a10: 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20  d origin.       
7a20: 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65   ** data for the
7a30: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
7a40: 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  mn of the sub-se
7a50: 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lect..        */
7a60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
7a70: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d  l>=0 && iCol<pS-
7a80: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
7a90: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
7aa0: 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74  f iCol is less t
7ab0: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
7ac0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
7ad0: 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20  quests the.     
7ae0: 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66       ** rowid of
7af0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
7b00: 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78  or view. This ex
7b10: 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61  pression is lega
7b20: 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20  l (see .        
7b30: 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d    ** test case m
7b40: 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61  isc2.2.2) - it a
7b50: 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20  lways evaluates 
7b60: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  to NULL..       
7b70: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
7b80: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
7b90: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
7ba0: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
7bb0: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  >a[iCol].pExpr;.
7bc0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53            sNC.pS
7bd0: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
7be0: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  c;.          sNC
7bf0: 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  .pNext = 0;.    
7c00: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
7c10: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
7c20: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
7c30: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
7c40: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62  C, p, &zOriginDb
7c50: 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26  , &zOriginTab, &
7c60: 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20  zOriginCol); .  
7c70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
7c80: 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53  lse if( pTab->pS
7c90: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
7ca0: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
7cb0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
7cc0: 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20  rt( !pS );.     
7cd0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
7ce0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
7cf0: 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ey;.        asse
7d00: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
7d10: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
7d20: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
7d30: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
7d40: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
7d50: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
7d60: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  ";.          zOr
7d70: 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69 64  iginCol = "rowid
7d80: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
7d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
7da0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
7db0: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
7dc0: 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c        zOriginCol
7dd0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
7de0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
7df0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72     }.        zOr
7e00: 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62 2d 3e  iginTab = pTab->
7e10: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
7e20: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29  f( pNC->pParse )
7e30: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
7e40: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
7e50: 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e  emaToIndex(pNC->
7e60: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
7e70: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
7e80: 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44 62 20        zOriginDb 
7e90: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
7ea0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
7eb0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
7ec0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7ed0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
7ee0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
7ef0: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
7f00: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
7f10: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
7f20: 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  on is a sub-sele
7f30: 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  ct. Return the d
7f40: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
7f50: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69  and.      ** ori
7f60: 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65  gin info for the
7f70: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69   single column i
7f80: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
7f90: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
7fa0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
7fb0: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
7fc0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
7fd0: 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  C;.      Select 
7fe0: 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70 53 65  *pS = pExpr->pSe
7ff0: 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72  lect;.      Expr
8000: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
8010: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
8020: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
8030: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
8040: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
8050: 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50  NC;.      sNC.pP
8060: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
8070: 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  se;.      zType 
8080: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
8090: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44 62  C, p, &zOriginDb
80a0: 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20 26  , &zOriginTab, &
80b0: 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20 20  zOriginCol); .  
80c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
80d0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20  .#endif.  }.  . 
80e0: 20 69 66 28 20 70 7a 4f 72 69 67 69 6e 44 62 20   if( pzOriginDb 
80f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
8100: 7a 4f 72 69 67 69 6e 54 61 62 20 26 26 20 70 7a  zOriginTab && pz
8110: 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20 20  OriginCol );.   
8120: 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20 7a   *pzOriginDb = z
8130: 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a 70  OriginDb;.    *p
8140: 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f 72  zOriginTab = zOr
8150: 69 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70 7a  iginTab;.    *pz
8160: 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72 69  OriginCol = zOri
8170: 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72 65  ginCol;.  }.  re
8180: 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f  turn zType;.}../
8190: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
81a0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
81b0: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64  l the VDBE the d
81c0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73  eclaration types
81d0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
81e0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
81f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8200: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
8210: 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ypes(.  Parse *p
8220: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
8230: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
8240: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
8250: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
8260: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
8270: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
8280: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
8290: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
82a0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23  sult set */.){.#
82b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
82c0: 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64  IT_DECLTYPE.  Vd
82d0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
82e0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
82f0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
8300: 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  C;.  sNC.pSrcLis
8310: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
8320: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
8330: 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  rse;.  for(i=0; 
8340: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
8350: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
8360: 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *p = pEList->a[i
8370: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e  ].pExpr;.    con
8380: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
8390: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
83a0: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
83b0: 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63  DATA.    const c
83c0: 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30  har *zOrigDb = 0
83d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
83e0: 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a   *zOrigTab = 0;.
83f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8400: 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20  zOrigCol = 0;.  
8410: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
8420: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
8430: 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61  OrigDb, &zOrigTa
8440: 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a 0a  b, &zOrigCol);..
8450: 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20      /* The vdbe 
8460: 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77  must make its ow
8470: 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  n copy of the co
8480: 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74  lumn-type and ot
8490: 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75  her .    ** colu
84a0: 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72 69  mn specific stri
84b0: 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65  ngs, in case the
84c0: 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65 74   schema is reset
84d0: 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20   before this.   
84e0: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68   ** virtual mach
84f0: 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ine is deleted..
8500: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
8510: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
8520: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
8530: 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62  ATABASE, zOrigDb
8540: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
8550: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
8560: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8570: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42  , i, COLNAME_TAB
8580: 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51  LE, zOrigTab, SQ
8590: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
85a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
85b0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
85c0: 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c   COLNAME_COLUMN,
85d0: 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54   zOrigCol, SQLIT
85e0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65  E_TRANSIENT);.#e
85f0: 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  lse.    zType = 
8600: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
8610: 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65   p, 0, 0, 0);.#e
8620: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
8630: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8640: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43  , i, COLNAME_DEC
8650: 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51  LTYPE, zType, SQ
8660: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
8670: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
8680: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
8690: 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  YPE */.}../*.** 
86a0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
86b0: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
86c0: 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20   VDBE the names 
86d0: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
86e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
86f0: 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
8700: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  on is used to pr
8710: 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43  ovide the.** azC
8720: 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74  ol[] values in t
8730: 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he callback..*/.
8740: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
8750: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
8760: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8770: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
8780: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
8790: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
87a0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
87b0: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
87c0: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
87d0: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
87e0: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
87f0: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
8800: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
8810: 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  dbe;.  int i, j;
8820: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
8830: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
8840: 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68  nt fullNames, sh
8850: 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64  ortNames;..#ifnd
8860: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
8870: 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74  XPLAIN.  /* If t
8880: 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49  his is an EXPLAI
8890: 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65  N, skip this ste
88a0: 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73  p */.  if( pPars
88b0: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
88c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
88d0: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
88e0: 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  v!=0 );.  if( pP
88f0: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
8900: 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 64 62 2d  t || v==0 || db-
8910: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
8920: 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65  return;.  pParse
8930: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
8940: 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d  1;.  fullNames =
8950: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
8960: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
8970: 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61  s)!=0;.  shortNa
8980: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
8990: 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
89a0: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
89b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
89c0: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
89d0: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
89e0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
89f0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
8a00: 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70  pr *p;.    p = p
8a10: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
8a20: 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  r;.    if( p==0 
8a30: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8a40: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
8a50: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
8a60: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
8a70: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8a80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8a90: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8aa0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8ab0: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
8ac0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
8ad0: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
8ae0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
8af0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
8b00: 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74  UMN) && pTabList
8b10: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
8b20: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
8b30: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
8b40: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
8b50: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
8b60: 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d  j=0; j<pTabList-
8b70: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
8b80: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
8b90: 3d 70 2d 3e 69 54 61 62 6c 65 3b 20 6a 2b 2b 29  =p->iTable; j++)
8ba0: 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  {}.      assert(
8bb0: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
8bc0: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
8bd0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
8be0: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
8bf0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
8c00: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
8c10: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
8c20: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
8c30: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
8c40: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
8c50: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
8c60: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69      zCol = "rowi
8c70: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d";.      }else{
8c80: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
8c90: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
8ca0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
8cb0: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
8cc0: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
8cd0: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mes ){.        s
8ce0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8cf0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8d00: 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20  ME_NAME, .      
8d10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
8d20: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
8d30: 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d 3e  *)p->span.z, p->
8d40: 73 70 61 6e 2e 6e 29 2c 20 53 51 4c 49 54 45 5f  span.n), SQLITE_
8d50: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
8d60: 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61  }else if( fullNa
8d70: 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e 61  mes || (!shortNa
8d80: 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73 74 2d  mes && pTabList-
8d90: 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20 20  >nSrc>1) ){.    
8da0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
8db0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61  = 0;.        cha
8dc0: 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20 20  r *zTab;. .     
8dd0: 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69     zTab = pTabLi
8de0: 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73 3b  st->a[j].zAlias;
8df0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 75 6c  .        if( ful
8e00: 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d 3d  lNames || zTab==
8e10: 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62 2d  0 ) zTab = pTab-
8e20: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
8e30: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
8e40: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
8e50: 73 22 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b  s", zTab, zCol);
8e60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8e70: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8e80: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
8e90: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
8ea0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
8eb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8ec0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8ed0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8ee0: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20  AME_NAME, zCol, 
8ef0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
8f00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8f10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      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 0a 20 20 20 20 20 20 20 20 20  NAME, .         
8f50: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
8f60: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d 3e  p(db, (char*)p->
8f70: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
8f80: 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d  n), SQLITE_DYNAM
8f90: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  IC);.    }.  }. 
8fa0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
8fb0: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
8fc0: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
8fd0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8fe0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
8ff0: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
9000: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
9010: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
9020: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
9030: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
9040: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
9050: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
9060: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
9070: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
9080: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
9090: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
90a0: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
90b0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
90c0: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
90d0: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
90e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
90f0: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
9100: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
9110: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
9120: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
9130: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
9140: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
9150: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9160: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
9170: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
9180: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20 65  .** Given a an e
9190: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28  xpression list (
91a0: 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20  which is really 
91b0: 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72  the list of expr
91c0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
91d0: 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20  form the result 
91e0: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20  set of a SELECT 
91f0: 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75  statement) compu
9200: 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  te appropriate.*
9210: 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  * column names f
9220: 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  or a table that 
9230: 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
9240: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
9250: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e  **.** All column
9260: 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75   names will be u
9270: 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  nique..**.** Onl
9280: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
9290: 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e  es are computed.
92a0: 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20    Column.zType, 
92b0: 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a  Column.zColl,.**
92c0: 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
92d0: 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20  s of Column are 
92e0: 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  zeroed..**.** Re
92f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
9300: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61  n success.  If a
9310: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
9320: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
9330: 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69  .** store NULL i
9340: 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69  n *paCol and 0 i
9350: 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74  n *pnCol and ret
9360: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9380: 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
9390: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
93a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
93b0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
93c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
93d0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
93e0: 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73       /* Expr lis
93f0: 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  t from which to 
9400: 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61  derive column na
9410: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  mes */.  int *pn
9420: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
9430: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
9440: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
9450: 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  here */.  Column
9460: 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20   **paCol        
9470: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
9480: 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  ew column list h
9490: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
94a0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
94b0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  ->db;.  int i, j
94c0: 2c 20 63 6e 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20  , cnt;.  Column 
94d0: 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 20 20  *aCol, *pCol;.  
94e0: 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 45 78 70 72  int nCol;.  Expr
94f0: 20 2a 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61   *p;.  char *zNa
9500: 6d 65 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  me;.  int nName;
9510: 0a 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  ..  *pnCol = nCo
9520: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
9530: 72 3b 0a 20 20 61 43 6f 6c 20 3d 20 2a 70 61 43  r;.  aCol = *paC
9540: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ol = sqlite3DbMa
9550: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
9560: 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f  eof(aCol[0])*nCo
9570: 6c 29 3b 0a 20 20 69 66 28 20 61 43 6f 6c 3d 3d  l);.  if( aCol==
9580: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
9590: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 66 6f 72 28 69  E_NOMEM;.  for(i
95a0: 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
95b0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  <nCol; i++, pCol
95c0: 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20  ++){.    /* Get 
95d0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e  an appropriate n
95e0: 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ame for the colu
95f0: 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20  mn.    */.    p 
9600: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
9610: 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
9620: 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c  ( p->pRight==0 |
9630: 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b  | p->pRight->tok
9640: 65 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52  en.z==0 || p->pR
9650: 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  ight->token.z[0]
9660: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
9670: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
9680: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29  a[i].zName)!=0 )
9690: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
96a0: 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  e column contain
96b0: 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22  s an "AS <name>"
96c0: 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61   phrase, use <na
96d0: 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20  me> as the name 
96e0: 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  */.      zName =
96f0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
9700: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
9710: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
9720: 70 72 20 2a 70 43 6f 6c 20 3d 20 70 3b 0a 20 20  pr *pCol = p;.  
9730: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
9740: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43  .      while( pC
9750: 6f 6c 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  ol->op==TK_DOT )
9760: 20 70 43 6f 6c 20 3d 20 70 43 6f 6c 2d 3e 70 52   pCol = pCol->pR
9770: 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
9780: 70 43 6f 6c 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  pCol->op==TK_COL
9790: 55 4d 4e 20 26 26 20 28 70 54 61 62 20 3d 20 70  UMN && (pTab = p
97a0: 43 6f 6c 2d 3e 70 54 61 62 29 21 3d 30 20 29 7b  Col->pTab)!=0 ){
97b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
97c0: 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20  columns use the 
97d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65  column name name
97e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
97f0: 69 43 6f 6c 20 3d 20 70 43 6f 6c 2d 3e 69 43 6f  iCol = pCol->iCo
9800: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  lumn;.        if
9810: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
9820: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
9830: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
9840: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
9850: 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20  , "%s",.        
9860: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30           iCol>=0
9870: 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   ? pTab->aCol[iC
9880: 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77  ol].zName : "row
9890: 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id");.      }els
98a0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73  e{.        /* Us
98b0: 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
98c0: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
98d0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
98e0: 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
98f0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
9900: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
9910: 25 54 22 2c 20 26 70 43 6f 6c 2d 3e 73 70 61 6e  %T", &pCol->span
9920: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9930: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
9940: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
9950: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9960: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
9970: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9980: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
9990: 74 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  te(zName);..    
99a0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
99b0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
99c0: 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20  unique.  If the 
99d0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71  name is not uniq
99e0: 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e  ue,.    ** appen
99f0: 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74  d a integer to t
9a00: 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20  he name so that 
9a10: 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75  it becomes uniqu
9a20: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e  e..    */.    nN
9a30: 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  ame = strlen(zNa
9a40: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63  me);.    for(j=c
9a50: 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  nt=0; j<i; j++){
9a60: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9a70: 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a  e3StrICmp(aCol[j
9a80: 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
9a90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  =0 ){.        ch
9aa0: 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20  ar *zNewName;.  
9ab0: 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d        zName[nNam
9ac0: 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  e] = 0;.        
9ad0: 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74  zNewName = sqlit
9ae0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
9af0: 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b  s:%d", zName, ++
9b00: 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  cnt);.        sq
9b10: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9b20: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
9b30: 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65  zName = zNewName
9b40: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31  ;.        j = -1
9b50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  ;.        if( zN
9b60: 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ame==0 ) break;.
9b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9b80: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
9b90: 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28  zName;.  }.  if(
9ba0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9bb0: 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  d ){.    int j;.
9bc0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69      for(j=0; j<i
9bd0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; j++){.      sq
9be0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9bf0: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[j].zName);.
9c00: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9c10: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
9c20: 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20  );.    *paCol = 
9c30: 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20  0;.    *pnCol = 
9c40: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
9c50: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
9c60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9c70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  OK;.}../*.** Add
9c80: 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74   type and collat
9c90: 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ion information 
9ca0: 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74  to a column list
9cb0: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53   based on.** a S
9cc0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
9cd0: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75  .** .** The colu
9ce0: 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62  mn list presumab
9cf0: 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c  ly came from sel
9d00: 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72  ectColumnNamesFr
9d10: 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a  omExprList()..**
9d20: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
9d30: 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c   has only names,
9d40: 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f   not types or co
9d50: 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a  llations.  This.
9d60: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  ** routine goes 
9d70: 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73  through and adds
9d80: 20 74 68 65 20 74 79 70 65 73 20 61 6e 64 20 63   the types and c
9d90: 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  ollations..**.**
9da0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
9db0: 71 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20  quires that all 
9dc0: 69 6e 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20  indentifiers in 
9dd0: 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  the SELECT.** st
9de0: 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c  atement be resol
9df0: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
9e00: 6f 69 64 20 73 65 6c 65 63 74 41 64 64 43 6f 6c  oid selectAddCol
9e10: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
9e20: 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
9e30: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
9e40: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73  Parsing contexts
9e50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20   */.  int nCol, 
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9e70: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9e80: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43   */.  Column *aC
9e90: 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ol,         /* L
9ea0: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a  ist of columns *
9eb0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
9ec0: 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c  ect       /* SEL
9ed0: 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65  ECT used to dete
9ee0: 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20  rmine types and 
9ef0: 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b  collations */.){
9f00: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9f10: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e   pParse->db;.  N
9f20: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
9f30: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
9f40: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9f50: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
9f60: 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45  r *p;.  struct E
9f70: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
9f80: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
9f90: 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ect!=0 );.  asse
9fa0: 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  rt( (pSelect->se
9fb0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
9fc0: 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73  lved)!=0 );.  as
9fd0: 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 70 53 65 6c  sert( nCol==pSel
9fe0: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
9ff0: 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
a000: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
a010: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a020: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
a030: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
a040: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
a050: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
a060: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d  ect->pSrc;.  a =
a070: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
a080: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ->a;.  for(i=0, 
a090: 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
a0a0: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
a0b0: 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45  .    p = a[i].pE
a0c0: 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a  xpr;.    pCol->z
a0d0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Type = sqlite3Db
a0e0: 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d  StrDup(db, colum
a0f0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
a100: 2c 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43  , 0, 0));.    pC
a110: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
a120: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
a130: 74 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c 6c  ty(p);.    pColl
a140: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
a150: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
a160: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
a170: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  ){.      pCol->z
a180: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  Coll = sqlite3Db
a190: 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c  StrDup(db, pColl
a1a0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
a1b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
a1c0: 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  en a SELECT stat
a1d0: 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20  ement, generate 
a1e0: 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  a Table structur
a1f0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
a200: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
a210: 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43  et of that SELEC
a220: 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  T..*/.Table *sql
a230: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
a240: 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61  elect(Parse *pPa
a250: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
a260: 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a  lect){.  Table *
a270: 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  pTab;.  sqlite3 
a280: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
a290: 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61  ;.  int savedFla
a2a0: 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67  gs;..  savedFlag
a2b0: 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
a2c0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
a2d0: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
a2e0: 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  es;.  db->flags 
a2f0: 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
a300: 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74  olNames;.  sqlit
a310: 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
a320: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29  rse, pSelect, 0)
a330: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
a340: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
a350: 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
a360: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c  t->pPrior ) pSel
a370: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
a380: 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61  Prior;.  db->fla
a390: 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b  gs = savedFlags;
a3a0: 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
a3b0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
a3c0: 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20  , sizeof(Table) 
a3d0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
a3e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
a3f0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 64 62  ;.  }.  pTab->db
a400: 20 3d 20 64 62 3b 0a 20 20 70 54 61 62 2d 3e 6e   = db;.  pTab->n
a410: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d  Ref = 1;.  pTab-
a420: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 73 65  >zName = 0;.  se
a430: 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  lectColumnsFromE
a440: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
a450: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c  pSelect->pEList,
a460: 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
a470: 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65  Tab->aCol);.  se
a480: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
a490: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
a4a0: 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  arse, pTab->nCol
a4b0: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53  , pTab->aCol, pS
a4c0: 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
a4d0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
a4e0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
a4f0: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
a500: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 54 61  3DeleteTable(pTa
a510: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  b);.    return 0
a520: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
a530: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Tab;.}../*.** Ge
a540: 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65  t a VDBE for the
a550: 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f   given parser co
a560: 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61  ntext.  Create a
a570: 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
a580: 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20  ssary..** If an 
a590: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
a5a0: 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65  turn NULL and le
a5b0: 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e  ave a message in
a5c0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65   pParse..*/.Vdbe
a5d0: 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65   *sqlite3GetVdbe
a5e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
a5f0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
a600: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66  rse->pVdbe;.  if
a610: 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20  ( v==0 ){.    v 
a620: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  = pParse->pVdbe 
a630: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65  = sqlite3VdbeCre
a640: 61 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ate(pParse->db);
a650: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a660: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69  OMIT_TRACE.    i
a670: 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 73 71  f( v ){.      sq
a680: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
a690: 76 2c 20 4f 50 5f 54 72 61 63 65 29 3b 0a 20 20  v, OP_Trace);.  
a6a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
a6b0: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f   return v;.}.../
a6c0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
a6d0: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
a6e0: 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
a6f0: 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
a700: 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
a710: 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72  and pOffset expr
a720: 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74  essions.  pLimit
a730: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c   and pOffset hol
a740: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
a750: 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72  s.** that appear
a760: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
a770: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
a780: 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61  fter the LIMIT a
a790: 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79  nd OFFSET.** key
a7a0: 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20  words.  Or NULL 
a7b0: 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64  if those keyword
a7c0: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69  s are omitted. i
a7d0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
a7e0: 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e  t .** are the in
a7f0: 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67  teger memory reg
a800: 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f  ister numbers fo
a810: 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  r counters used 
a820: 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74  to compute .** t
a830: 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  he limit and off
a840: 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69  set.  If there i
a850: 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f  s no limit and/o
a860: 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a  r offset, then .
a870: 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  ** iLimit and iO
a880: 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69  ffset are negati
a890: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ve..**.** This r
a8a0: 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74  outine changes t
a8b0: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69  he values of iLi
a8c0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
a8d0: 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d  only if.** a lim
a8e0: 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20  it or offset is 
a8f0: 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69  defined by pLimi
a900: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20  t and pOffset.  
a910: 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f  iLimit and.** iO
a920: 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
a930: 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
a940: 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
a950: 61 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28  ault values.** (
a960: 75 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20  usually but not 
a970: 61 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72  always -1) prior
a980: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
a990: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c   routine..** Onl
a9a0: 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f  y if pLimit!=0 o
a9b0: 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20  r pOffset!=0 do 
a9c0: 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
a9d0: 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66  ers get.** redef
a9e0: 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e  ined.  The UNION
a9f0: 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73   ALL operator us
aa00: 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79  es this property
aa10: 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65   to force.** the
aa20: 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61   reuse of the sa
aa30: 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  me limit and off
aa40: 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63  set registers ac
aa50: 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  ross multiple.**
aa60: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
aa70: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
aa80: 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  id computeLimitR
aa90: 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a  egisters(Parse *
aaa0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
aab0: 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a  p, int iBreak){.
aac0: 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20    Vdbe *v = 0;. 
aad0: 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b   int iLimit = 0;
aae0: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a  .  int iOffset;.
aaf0: 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 69    int addr1;.  i
ab00: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72  f( p->iLimit ) r
ab10: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20  eturn;..  /* .  
ab20: 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c  ** "LIMIT -1" al
ab30: 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72  ways shows all r
ab40: 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73  ows.  There is s
ab50: 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76  ome.  ** contrav
ab60: 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20  ersy about what 
ab70: 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
ab80: 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a  vior should be..
ab90: 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74    ** The current
aba0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
abb0: 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49  interprets "LIMI
abc0: 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a  T 0" to mean.  *
abd0: 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  * no rows..  */.
abe0: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
abf0: 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  ){.    p->iLimit
ac00: 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50   = iLimit = ++pP
ac10: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
ac20: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
ac30: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
ac40: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
ac50: 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  n;.    sqlite3Ex
ac60: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
ac70: 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74  ->pLimit, iLimit
ac80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
ac90: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
aca0: 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74  ustBeInt, iLimit
acb0: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
acc0: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
acd0: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 73 71  unter"));.    sq
ace0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
acf0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
ad00: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  imit, iBreak);. 
ad10: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66   }.  if( p->pOff
ad20: 73 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f  set ){.    p->iO
ad30: 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20  ffset = iOffset 
ad40: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
ad50: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69  ;.    if( p->pLi
ad60: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
ad70: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
ad80: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
ad90: 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
ada0: 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
adb0: 0a 20 20 20 20 7d 0a 20 20 20 20 76 20 3d 20 73  .    }.    v = s
adc0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
add0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
ade0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
adf0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
ae00: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66  e(pParse, p->pOf
ae10: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a  fset, iOffset);.
ae20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ae30: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
ae40: 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b  BeInt, iOffset);
ae50: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
ae60: 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75  ((v, "OFFSET cou
ae70: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 61 64 64  nter"));.    add
ae80: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
ae90: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
aea0: 6f 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  os, iOffset);.  
aeb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
aec0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
aed0: 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a  r, 0, iOffset);.
aee0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
aef0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
af00: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  );.    if( p->pL
af10: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71  imit ){.      sq
af20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
af30: 76 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69  v, OP_Add, iLimi
af40: 74 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66  t, iOffset, iOff
af50: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64  set+1);.      Vd
af60: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
af70: 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a  IMIT+OFFSET"));.
af80: 20 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71        addr1 = sq
af90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
afa0: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69  v, OP_IfPos, iLi
afb0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mit);.      sqli
afc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
afd0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c   OP_Integer, -1,
afe0: 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20   iOffset+1);.   
aff0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
b000: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
b010: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
b020: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b030: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
b040: 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  CT./*.** Return 
b050: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
b060: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
b070: 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d  ce for the iCol-
b080: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  th column of.** 
b090: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66  the result set f
b0a0: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d  or the compound-
b0b0: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
b0c0: 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55   "p".  Return NU
b0d0: 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  LL if.** the col
b0e0: 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75  umn has no defau
b0f0: 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  lt collating seq
b100: 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uence..**.** The
b110: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
b120: 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  nce for the comp
b130: 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74  ound select is t
b140: 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  aken from the.**
b150: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
b160: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68  of the select th
b170: 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  at has a collati
b180: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
b190: 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
b1a0: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
b1b0: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
b1c0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
b1d0: 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65   iCol){.  CollSe
b1e0: 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70  q *pRet;.  if( p
b1f0: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
b200: 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65  pRet = multiSele
b210: 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
b220: 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f  , p->pPrior, iCo
b230: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
b240: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
b250: 20 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a   if( pRet==0 ){.
b260: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
b270: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
b280: 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  arse, p->pEList-
b290: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b  >a[iCol].pExpr);
b2a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
b2b0: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  et;.}.#endif /* 
b2c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
b2d0: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
b2e0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
b2f0: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
b300: 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
b310: 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
b320: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
b330: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
b340: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
b350: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
b360: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
b370: 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
b380: 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
b390: 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
b3a0: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
b3b0: 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
b3c0: 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65  s */.);...#ifnde
b3d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
b3e0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
b3f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
b400: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
b410: 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ocess a compound
b420: 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d   query form from
b430: 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  .** two or more 
b440: 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
b450: 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e   using UNION, UN
b460: 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c  ION ALL, EXCEPT,
b470: 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54   or.** INTERSECT
b480: 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
b490: 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
b4a0: 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
b4b0: 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
b4c0: 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
b4d0: 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
b4e0: 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
b4f0: 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
b500: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
b510: 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
b520: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
b530: 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
b540: 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
b550: 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
b560: 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
b570: 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
b580: 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
b590: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
b5a0: 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
b5b0: 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
b5c0: 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
b5d0: 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
b5e0: 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
b5f0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
b600: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
b610: 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
b620: 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
b630: 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
b640: 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
b650: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
b660: 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
b670: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
b680: 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
b690: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
b6a0: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
b6b0: 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
b6c0: 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
b6e0: 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
b6f0: 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
b700: 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
b710: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
b720: 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
b730: 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
b740: 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
b750: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
b760: 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
b770: 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
b780: 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
b790: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
b7a0: 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
b7b0: 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
b7c0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
b7d0: 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
b7e0: 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
b7f0: 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
b800: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
b810: 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
b820: 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
b830: 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
b840: 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
b850: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
b860: 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
b870: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
b880: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
b890: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
b8a0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
b8b0: 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
b8c0: 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
b8d0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
b8e0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
b8f0: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
b900: 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
b910: 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
b920: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
b930: 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
b940: 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
b950: 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
b960: 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
b970: 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
b980: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
b990: 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
b9a0: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
b9b0: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
b9c0: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
b9d0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
b9e0: 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41   dest;      /* A
b9f0: 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20  lternative data 
ba00: 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
ba10: 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65   Select *pDelete
ba20: 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20   = 0;  /* Chain 
ba30: 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  of simple select
ba40: 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
ba50: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
ba60: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
ba70: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
ba80: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
ba90: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
baa0: 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
bab0: 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
bac0: 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
bad0: 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
bae0: 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
baf0: 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
bb00: 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
bb10: 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
bb20: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
bb30: 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
bb40: 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
bb50: 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
bb60: 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20  is much */.  db 
bb70: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
bb80: 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
bb90: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
bba0: 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74  rior->pRightmost
bbb0: 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73  !=pPrior );.  as
bbc0: 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52  sert( pPrior->pR
bbd0: 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69  ightmost==p->pRi
bbe0: 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73  ghtmost );.  des
bbf0: 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66  t = *pDest;.  if
bc00: 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
bc10: 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
bc20: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
bc30: 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
bc40: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
bc50: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
bc60: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
bc70: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
bc80: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
bc90: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
bca0: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
bcb0: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
bcc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
bcd0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
bce0: 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
bcf0: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
bd00: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
bd10: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
bd20: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
bd30: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
bd40: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
bd50: 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69  .  }..  v = sqli
bd60: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
bd70: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
bd80: 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44  =0 );  /* The VD
bd90: 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  BE already creat
bda0: 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75  ed by calling fu
bdb0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
bdc0: 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
bdd0: 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
bde0: 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
bdf0: 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
be00: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
be10: 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
be20: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
be30: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
be40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
be50: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
be60: 65 73 74 2e 69 50 61 72 6d 2c 20 70 2d 3e 70 45  est.iParm, p->pE
be70: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
be80: 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
be90: 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
bea0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
beb0: 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65  l SELECTs in the
bec0: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20   statement have 
bed0: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
bee0: 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  of elements.  **
bef0: 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74   in their result
bf00: 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73   sets..  */.  as
bf10: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
bf20: 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  && pPrior->pELis
bf30: 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45  t );.  if( p->pE
bf40: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72  List->nExpr!=pPr
bf50: 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ior->pEList->nEx
bf60: 70 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  pr ){.    sqlite
bf70: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
bf80: 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
bf90: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
bfa0: 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20   of %s".      " 
bfb0: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
bfc0: 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
bfd0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
bfe0: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
bff0: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
c000: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
c010: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
c020: 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20  ..  /* Compound 
c030: 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76  SELECTs that hav
c040: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
c050: 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64  ause are handled
c060: 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a   separately..  *
c070: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  /.  if( p->pOrde
c080: 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rBy ){.    retur
c090: 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  n multiSelectOrd
c0a0: 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  erBy(pParse, p, 
c0b0: 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pDest);.  }..  /
c0c0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c0d0: 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64  for the left and
c0e0: 20 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74   right SELECT st
c0f0: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
c100: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
c110: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c  {.    case TK_AL
c120: 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  L: {.      int a
c130: 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  ddr = 0;.      a
c140: 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
c150: 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
c160: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
c170: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
c180: 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65    pPrior->pOffse
c190: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
c1a0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c1b0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c1c0: 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b   pPrior, &dest);
c1d0: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
c1e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
c1f0: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
c200: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
c210: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
c220: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
c230: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
c240: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  or = 0;.      p-
c250: 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
c260: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
c270: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72  p->iOffset = pPr
c280: 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  ior->iOffset;.  
c290: 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69      if( p->iLimi
c2a0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64  t ){.        add
c2b0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
c2c0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp1(v, OP_IfZe
c2d0: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a  ro, p->iLimit);.
c2e0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
c2f0: 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68  ent((v, "Jump ah
c300: 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61  ead if LIMIT rea
c310: 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d  ched"));.      }
c320: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c330: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
c340: 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
c350: 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
c360: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
c370: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
c380: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
c390: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
c3a0: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c3b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
c3c0: 66 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20  f( addr ){.     
c3d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
c3e0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
c3f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
c400: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
c410: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a  case TK_EXCEPT:.
c420: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f      case TK_UNIO
c430: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75  N: {.      int u
c440: 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43  nionTab;    /* C
c450: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
c460: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
c470: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75  ble holding resu
c480: 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lt */.      int 
c490: 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  op = 0;      /* 
c4a0: 4f 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20  One of the SRT_ 
c4b0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70  operations to ap
c4c0: 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20  ply to self */. 
c4d0: 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
c4e0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
c4f0: 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
c500: 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
c510: 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45  lects */.      E
c520: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
c530: 66 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20  ffset; /* Saved 
c540: 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69  values of p->nLi
c550: 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73  mit and p->nOffs
c560: 65 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  et */.      int 
c570: 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
c580: 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74  ctDest uniondest
c590: 3b 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70  ;..      priorOp
c5a0: 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
c5b0: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
c5c0: 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 21  st==priorOp && !
c5d0: 70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70 2d  p->pLimit && !p-
c5e0: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
c5f0: 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
c600: 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
c610: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
c620: 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
c630: 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
c640: 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
c650: 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
c660: 20 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20   = dest.iParm;. 
c670: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c680: 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
c690: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
c6a0: 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
c6b0: 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
c6c0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
c6d0: 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
c6e0: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
c6f0: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
c700: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
c710: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c720: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
c730: 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
c740: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c750: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
c760: 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61  hemeral, unionTa
c770: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  b, 0);.        a
c780: 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
c790: 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
c7a0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
c7b0: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
c7c0: 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  addr;.        p-
c7d0: 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c  >pRightmost->sel
c7e0: 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
c7f0: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20  Ephemeral;.     
c800: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
c810: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
c820: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
c830: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
c840: 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
c850: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c860: 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
c870: 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
c880: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
c890: 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
c8a0: 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
c8b0: 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 72  ionTab);.      r
c8c0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
c8d0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
c8e0: 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
c8f0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
c900: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
c910: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
c920: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
c930: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
c940: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c950: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
c960: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45   if( p->op==TK_E
c970: 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20  XCEPT ){.       
c980: 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74   op = SRT_Except
c990: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c9a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c9b0: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
c9c0: 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53  ;.        op = S
c9d0: 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
c9e0: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
c9f0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  r = 0;.      pLi
ca00: 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
ca10: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
ca20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
ca30: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
ca40: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
ca50: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e  et = 0;.      un
ca60: 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20  iondest.eDest = 
ca70: 6f 70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  op;.      rc = s
ca80: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
ca90: 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65  rse, p, &unionde
caa0: 73 74 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75  st);.      /* Qu
cab0: 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ery flattening i
cac0: 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
cad0: 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70  ) might refill p
cae0: 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20  ->pOrderBy..    
caf0: 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
cb00: 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
cb10: 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
cb20: 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
cb30: 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
cb40: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
cb50: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
cb60: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44  derBy);.      pD
cb70: 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
cb80: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
cb90: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
cba0: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
cbb0: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
cbc0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
cbd0: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
cbe0: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
cbf0: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
cc00: 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
cc10: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
cc20: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
cc30: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  iOffset = 0;.   
cc40: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
cc50: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
cc60: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
cc70: 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43    }...      /* C
cc80: 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
cc90: 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
cca0: 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
ccb0: 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
ccc0: 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
ccd0: 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
cce0: 0a 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a  .      */      .
ccf0: 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
cd00: 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c  Dest!=priorOp ||
cd10: 20 75 6e 69 6f 6e 54 61 62 21 3d 64 65 73 74 2e   unionTab!=dest.
cd20: 69 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  iParm ){.       
cd30: 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
cd40: 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
cd50: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
cd60: 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
cd70: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
cd80: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
cd90: 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
cda0: 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
cdb0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
cdc0: 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
cdd0: 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
cde0: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
cdf0: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
ce00: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
ce10: 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
ce20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ce30: 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
ce40: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
ce50: 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
ce60: 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
ce70: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
ce80: 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
ce90: 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
cea0: 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
ceb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cec0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ced0: 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61  _Rewind, unionTa
cee0: 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  b, iBreak);.    
cef0: 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
cf00: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
cf10: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
cf20: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
cf30: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
cf40: 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  List, unionTab, 
cf50: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
cf60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
cf70: 20 20 20 20 20 20 20 20 20 20 30 2c 20 2d 31 2c            0, -1,
cf80: 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
cf90: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
cfa0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
cfb0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
cfc0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
cfd0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cfe0: 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61  OP_Next, unionTa
cff0: 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  b, iStart);.    
d000: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
d010: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
d020: 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
d030: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d040: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  2(v, OP_Close, u
d050: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
d060: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
d070: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
d080: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b   TK_INTERSECT: {
d090: 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c  .      int tab1,
d0a0: 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74   tab2;.      int
d0b0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
d0c0: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78  iStart;.      Ex
d0d0: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
d0e0: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  fset;.      int 
d0f0: 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
d100: 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74  ctDest intersect
d110: 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  dest;.      int 
d120: 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  r1;..      /* IN
d130: 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
d140: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
d150: 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
d160: 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
d170: 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
d180: 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
d190: 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
d1a0: 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
d1b0: 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
d1c0: 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
d1d0: 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
d1e0: 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
d1f0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
d200: 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
d210: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
d220: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
d230: 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  derBy==0 );..   
d240: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
d250: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d260: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
d270: 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
d280: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
d290: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
d2a0: 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
d2b0: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
d2c0: 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
d2d0: 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c  Rightmost->selFl
d2e0: 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
d2f0: 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61  hemeral;.      a
d300: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
d310: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
d320: 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
d330: 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
d340: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
d350: 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
d360: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
d370: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
d380: 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
d390: 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
d3a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d3b0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
d3c0: 70 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65  pPrior, &interse
d3d0: 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69  ctdest);.      i
d3e0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
d3f0: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
d400: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
d410: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
d420: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
d430: 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  T into temporary
d440: 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20   table "tab2".  
d450: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
d460: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
d470: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
d480: 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c  Ephemeral, tab2,
d490: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
d4a0: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
d4b0: 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[1] == -1 );. 
d4c0: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
d4d0: 45 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[1] = addr;.
d4e0: 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
d4f0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
d500: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
d510: 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
d520: 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
d530: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
d540: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
d550: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65   = 0;.      inte
d560: 72 73 65 63 74 64 65 73 74 2e 69 50 61 72 6d 20  rsectdest.iParm 
d570: 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 72 63  = tab2;.      rc
d580: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
d590: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
d5a0: 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
d5b0: 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
d5c0: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
d5d0: 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
d5e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
d5f0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
d600: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
d610: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
d620: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
d630: 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
d640: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
d650: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
d660: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
d670: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
d680: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
d690: 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72  o take the inter
d6a0: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  section of the t
d6b0: 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  wo temporary.   
d6c0: 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20     ** tables..  
d6d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
d6e0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
d6f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
d700: 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  .eDest==SRT_Outp
d710: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65  ut ){.        Se
d720: 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70  lect *pFirst = p
d730: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
d740: 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
d750: 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
d760: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
d770: 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
d780: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
d790: 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
d7a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d7b0: 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
d7c0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
d7d0: 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  );.      iCont =
d7e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d7f0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
d800: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
d810: 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
d820: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
d830: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d840: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
d850: 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20  tab1, iBreak);. 
d860: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
d870: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
d880: 73 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72  se);.      iStar
d890: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
d8a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b  ddOp2(v, OP_RowK
d8b0: 65 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20  ey, tab1, r1);. 
d8c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d8d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
d8e0: 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
d8f0: 6e 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  nt, r1);.      s
d900: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
d910: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
d920: 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
d930: 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
d940: 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61  p, p->pEList, ta
d950: 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  b1, p->pEList->n
d960: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
d970: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 2d              0, -
d980: 31 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  1, &dest, iCont,
d990: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
d9a0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d9b0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
d9c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d9d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d9e0: 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
d9f0: 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
da00: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
da10: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
da20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
da30: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
da40: 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
da50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
da60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
da70: 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  se, tab1, 0);.  
da80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
da90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
daa0: 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
dab0: 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a  uences used by .
dac0: 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
dad0: 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
dae0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
daf0: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
db00: 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
db10: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
db20: 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
db30: 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  y tables..  **. 
db40: 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   ** This section
db50: 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72   is run by the r
db60: 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
db70: 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e   statement only.
db80: 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  .  ** SELECT sta
db90: 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c  tements to the l
dba0: 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20  eft always skip 
dbb0: 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20  this part.  The 
dbc0: 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
dbd0: 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73  SELECT might als
dbe0: 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  o skip this part
dbf0: 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52   if it has no OR
dc00: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
dc10: 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74  d.  ** no temp t
dc20: 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72  ables are requir
dc30: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
dc40: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
dc50: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  UsesEphemeral ){
dc60: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
dc90: 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
dca0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
dcb0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
dcc0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
dcd0: 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
dce0: 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   */.    Select *
dcf0: 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
dd00: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
dd10: 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c  ping through SEL
dd20: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
dd30: 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a  /.    CollSeq **
dd40: 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  apColl;         
dd50: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
dd60: 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49  ng through pKeyI
dd70: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a  nfo->aColl[] */.
dd80: 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
ddb0: 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
ddc0: 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73   set */..    ass
ddd0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
dde0: 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43 6f  st==p );.    nCo
ddf0: 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
de00: 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Expr;.    pKeyIn
de10: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
de20: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20  llocZero(db,.   
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79      sizeof(*pKey
de50: 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28 73 69 7a 65  Info)+nCol*(size
de60: 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31  of(CollSeq*) + 1
de70: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  ));.    if( !pKe
de80: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72  yInfo ){.      r
de90: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
dea0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  ;.      goto mul
deb0: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
dec0: 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e     }..    pKeyIn
ded0: 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  fo->enc = ENC(db
dee0: 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d  );.    pKeyInfo-
def0: 3e 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a  >nField = nCol;.
df00: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70  .    for(i=0, ap
df10: 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61  Coll=pKeyInfo->a
df20: 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  Coll; i<nCol; i+
df30: 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20  +, apColl++){.  
df40: 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75      *apColl = mu
df50: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
df60: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
df70: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70        if( 0==*ap
df80: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
df90: 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  *apColl = db->pD
dfa0: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
dfb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
dfc0: 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
dfd0: 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
dfe0: 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ior){.      for(
dff0: 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
e000: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
e010: 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70   = pLoop->addrOp
e020: 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20  enEphm[i];.     
e030: 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b     if( addr<0 ){
e040: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
e050: 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74   [0] is unused t
e060: 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20  hen [1] is also 
e070: 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63  unused.  So we c
e080: 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  an.          ** 
e090: 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62  always safely ab
e0a0: 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ort as soon as t
e0b0: 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20  he first unused 
e0c0: 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f  slot is found */
e0d0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
e0e0: 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70  t( pLoop->addrOp
e0f0: 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20  enEphm[1]<0 );. 
e100: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
e110: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e130: 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e  ngeP2(v, addr, n
e140: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
e150: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
e160: 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  4(v, addr, (char
e170: 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
e180: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
e190: 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e   pLoop->addrOpen
e1a0: 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[i] = -1;.  
e1b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e1c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e1d0: 2c 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d  , pKeyInfo);.  }
e1e0: 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  ..multi_select_e
e1f0: 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65  nd:.  pDest->iMe
e200: 6d 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b 0a 20  m = dest.iMem;. 
e210: 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64   pDest->nMem = d
e220: 65 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  est.nMem;.  sqli
e230: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
e240: 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20  db, pDelete);.  
e250: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
e260: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
e270: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
e280: 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  CT */../*.** Cod
e290: 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72  e an output subr
e2a0: 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72  outine for a cor
e2b0: 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
e2c0: 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45  ation of a.** SE
e2d0: 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a  LECT statment..*
e2e0: 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f  *.** The data to
e2f0: 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f   be output is co
e300: 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e  ntained in pIn->
e310: 69 4d 65 6d 2e 20 20 54 68 65 72 65 20 61 72 65  iMem.  There are
e320: 0a 2a 2a 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f  .** pIn->nMem co
e330: 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
e340: 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
e350: 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
e360: 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
e370: 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
e380: 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
e390: 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
e3a0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
e3b0: 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
e3c0: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
e3d0: 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
e3e0: 6e 20 69 74 20 69 73 20 61 20 74 68 65 20 66 69  n it is a the fi
e3f0: 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20  rst register in 
e400: 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a  a vector that.**
e410: 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72 65   records the pre
e420: 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d  vious output.  m
e430: 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61  em[regPrev] is a
e440: 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66 61   flag that is fa
e450: 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  lse.** if there 
e460: 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76  has been no prev
e470: 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66  ious output.  If
e480: 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
e490: 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72  code is.** gener
e4a0: 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73 73  ated to suppress
e4b0: 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b   duplicates.  pK
e4c0: 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66  eyInfo is used f
e4d0: 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20  or comparing.** 
e4e0: 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  keys..**.** If t
e4f0: 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69  he LIMIT found i
e500: 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72  n p->iLimit is r
e510: 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d  eached, jump imm
e520: 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69  ediately to.** i
e530: 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  Break..*/.static
e540: 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74   int generateOut
e550: 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20  putSubroutine(. 
e560: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
e570: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
e580: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
e590: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
e5a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e5b0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e5c0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
e5d0: 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a   *pIn,        /*
e5e0: 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c   Coroutine suppl
e5f0: 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53  ying data */.  S
e600: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
e610: 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20  ,      /* Where 
e620: 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74 61  to send the data
e630: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74   */.  int regRet
e640: 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  urn,          /*
e650: 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64 72   The return addr
e660: 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ess register */.
e670: 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20    int regPrev,  
e680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
e690: 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67  vious result reg
e6a0: 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75  ister.  No uniqu
e6b0: 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20  eness if 0 */.  
e6c0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
e6d0: 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63  o,      /* For c
e6e0: 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70 72  omparing with pr
e6f0: 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a  evious entry */.
e700: 20 20 69 6e 74 20 70 34 74 79 70 65 2c 20 20 20    int p4type,   
e710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e720: 20 70 34 20 74 79 70 65 20 66 6f 72 20 70 4b 65   p4 type for pKe
e730: 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  yInfo */.  int i
e740: 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
e750: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
e760: 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49  if we hit the LI
e770: 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  MIT */.){.  Vdbe
e780: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
e790: 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74  dbe;.  int iCont
e7a0: 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72  inue;.  int addr
e7b0: 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  ;..  addr = sqli
e7c0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
e7d0: 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e  dr(v);.  iContin
e7e0: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
e7f0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
e800: 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70   /* Suppress dup
e810: 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f  licates for UNIO
e820: 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
e830: 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20  NTERSECT .  */. 
e840: 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
e850: 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a      int j1, j2;.
e860: 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
e870: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
e880: 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29  _IfNot, regPrev)
e890: 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74  ;.    j2 = sqlit
e8a0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
e8b0: 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d  OP_Compare, pIn-
e8c0: 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31  >iMem, regPrev+1
e8d0: 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20  , pIn->nMem,.   
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
e900: 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79  *)pKeyInfo, p4ty
e910: 70 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pe);.    sqlite3
e920: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
e930: 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f  _Jump, j2+2, iCo
e940: 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20  ntinue, j2+2);. 
e950: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
e960: 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
e970: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
e980: 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70  deCopy(pParse, p
e990: 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65  In->iMem, regPre
e9a0: 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b  v+1, pIn->nMem);
e9b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e9c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
e9d0: 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76  eger, 1, regPrev
e9e0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
e9f0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
ea00: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
ea10: 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
ea20: 20 74 68 65 20 74 68 65 20 66 69 72 73 74 20 4f   the the first O
ea30: 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66  FFSET entries if
ea40: 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46   there is an OFF
ea50: 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  SET clause.  */.
ea60: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
ea70: 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a  p, iContinue);..
ea80: 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d    switch( pDest-
ea90: 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a  >eDest ){.    /*
eaa0: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
eab0: 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
eac0: 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
ead0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
eae0: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
eaf0: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
eb00: 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d  {.      int r1 =
eb10: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
eb20: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
eb30: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
eb40: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
eb50: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
eb60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
eb70: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
eb80: 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e  pIn->iMem, pIn->
eb90: 6e 4d 65 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  nMem, r1);.     
eba0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ebb0: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
ebc0: 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c  d, pDest->iParm,
ebd0: 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
ebe0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ebf0: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73   OP_Insert, pDes
ec00: 74 2d 3e 69 50 61 72 6d 2c 20 72 31 2c 20 72 32  t->iParm, r1, r2
ec10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ec20: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
ec30: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
ec40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
ec50: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
ec60: 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  se, r2);.      s
ec70: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
ec80: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
ec90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
eca0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
ecb0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
ecc0: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
ecd0: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
ece0: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
ecf0: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
ed00: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
ed10: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
ed20: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
ed30: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
ed40: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
ed50: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
ed60: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
ed70: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
ed80: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
ed90: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
eda0: 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61   int r1;.      a
edb0: 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d  ssert( pIn->nMem
edc0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==1 );.      p->
edd0: 61 66 66 69 6e 69 74 79 20 3d 20 0a 20 20 20 20  affinity = .    
ede0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70       sqlite3Comp
edf0: 61 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70  areAffinity(p->p
ee00: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
ee10: 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69  r, pDest->affini
ee20: 74 79 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  ty);.      r1 = 
ee30: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
ee40: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
ee50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ee60: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
ee70: 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  ord, pIn->iMem, 
ee80: 31 2c 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e  1, r1, &p->affin
ee90: 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ity, 1);.      s
eea0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
eeb0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
eec0: 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  arse, pIn->iMem,
eed0: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
eee0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
eef0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44  OP_IdxInsert, pD
ef00: 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 31 29 3b  est->iParm, r1);
ef10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
ef20: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
ef30: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
ef40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
ef50: 66 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63  f 0  /* Never oc
ef60: 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52  curs on an ORDER
ef70: 20 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20   BY query */.   
ef80: 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
ef90: 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75  xist in the resu
efa0: 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74  lt set, record t
efb0: 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f  hat fact and abo
efc0: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rt..    */.    c
efd0: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20  ase SRT_Exists: 
efe0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
eff0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f000: 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73  Integer, 1, pDes
f010: 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  t->iParm);.     
f020: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
f030: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
f040: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
f050: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
f060: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
f070: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
f080: 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
f090: 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
f0a0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
f0b0: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
f0c0: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
f0d0: 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
f0e0: 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
f0f0: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
f100: 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
f110: 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
f120: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
f130: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
f140: 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a  pIn->nMem==1 );.
f150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f160: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
f170: 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65  , pIn->iMem, pDe
f180: 73 74 2d 3e 69 50 61 72 6d 2c 20 31 29 3b 0a 20  st->iParm, 1);. 
f190: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
f1a0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
f1b0: 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
f1c0: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
f1d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f1e0: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
f1f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
f200: 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
f210: 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
f220: 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
f230: 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
f240: 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  ers.    ** start
f250: 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 4d  ing at pDest->iM
f260: 65 6d 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  em.  Then the co
f270: 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e  -routine yields.
f280: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
f290: 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
f2a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73  {.      if( pDes
f2b0: 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20  t->iMem==0 ){.  
f2c0: 20 20 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65        pDest->iMe
f2d0: 6d 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  m = sqlite3GetTe
f2e0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
f2f0: 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  pIn->nMem);.    
f300: 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20      pDest->nMem 
f310: 3d 20 70 49 6e 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  = pIn->nMem;.   
f320: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
f330: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
f340: 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  Parse, pIn->iMem
f350: 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 70  , pDest->iMem, p
f360: 44 65 73 74 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20  Dest->nMem);.   
f370: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f380: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
f390: 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b  , pDest->iParm);
f3a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f3b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75    }..    /* Resu
f3c0: 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
f3d0: 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
f3e0: 72 65 67 69 73 74 65 72 73 2e 20 20 54 68 65 6e  registers.  Then
f3f0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 50 5f 52   the.    ** OP_R
f400: 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20  esultRow opcode 
f410: 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65  is used to cause
f420: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
f430: 74 6f 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  to return.    **
f440: 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66   the next row of
f450: 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a   result..    */.
f460: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
f470: 70 75 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  put: {.      sql
f480: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f490: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
f4a0: 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e  pIn->iMem, pIn->
f4b0: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  nMem);.      sql
f4c0: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
f4d0: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
f4e0: 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70  se, pIn->iMem, p
f4f0: 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  In->nMem);.     
f500: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
f510: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
f520: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
f530: 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20  .    /* Discard 
f540: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
f550: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53  is is used for S
f560: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
f570: 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74   inside.    ** t
f580: 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49  he body of a TRI
f590: 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f  GGER.  The purpo
f5a0: 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63  se of such selec
f5b0: 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20  ts is to call.  
f5c0: 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65    ** user-define
f5d0: 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  d functions that
f5e0: 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63   have side effec
f5f0: 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63  ts.  We do not c
f600: 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74  are.    ** about
f610: 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75   the actual resu
f620: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
f630: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
f640: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62  fault: {.      b
f650: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
f660: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  if.  }..  /* Jum
f670: 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
f680: 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
f690: 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
f6a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
f6b0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
f6c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f6d0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d  v, OP_AddImm, p-
f6e0: 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20  >iLimit, -1);.  
f6f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f700: 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op2(v, OP_IfZero
f710: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
f720: 65 61 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eak);.  }..  /* 
f730: 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62  Generate the sub
f740: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20  routine return. 
f750: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
f760: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
f770: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73   iContinue);.  s
f780: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f790: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
f7a0: 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65  egReturn);..  re
f7b0: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
f7c0: 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20  .** Alternative 
f7d0: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
f7e0: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66  code generator f
f7f0: 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68  or cases when th
f800: 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44  ere.** is an ORD
f810: 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a  ER BY clause..**
f820: 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20  .** We assume a 
f830: 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c  query of the fol
f840: 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a  lowing form:.**.
f850: 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41  **      <selectA
f860: 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c  >  <operator>  <
f870: 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20  selectB>  ORDER 
f880: 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e  BY <orderbylist>
f890: 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  .**.** <operator
f8a0: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f  > is one of UNIO
f8b0: 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58  N ALL, UNION, EX
f8c0: 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
f8d0: 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a  CT.  The idea.**
f8e0: 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68   is to code both
f8f0: 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c   <selectA> and <
f900: 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68  selectB> with th
f910: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
f920: 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69  e as.** co-routi
f930: 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74  nes.  Then run t
f940: 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69  he co-routines i
f950: 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d  n parallel and m
f960: 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73  erge the results
f970: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  .** into the out
f980: 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f  put.  In additio
f990: 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72  n to the two cor
f9a0: 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20  outines (called 
f9b0: 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73  selectA and.** s
f9c0: 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72  electB) there ar
f9d0: 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a  e 7 subroutines:
f9e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  .**.**    outA: 
f9f0: 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
fa00: 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
fa10: 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  A coroutine into
fa20: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
fa30: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
fa40: 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
fa50: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  ..**.**    outB:
fa60: 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
fa70: 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
fa80: 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tB coroutine int
fa90: 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
fab0: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
fac0: 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61  y.  (Only genera
fad0: 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e  ted for UNION an
fae0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
faf0: 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43   UNION ALL.  EXC
fb00: 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45  EPT and INSERTSE
fb10: 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20  CT never output 
fb20: 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20  a row that.**   
fb30: 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72            appear
fb40: 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a  s only in B.).**
fb50: 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20  .**    AltB:    
fb60: 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
fb70: 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
fb80: 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
fb90: 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A<B..**.**   
fba0: 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64   AeqB:    Called
fbb0: 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
fbc0: 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
fbd0: 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d  routines and A==
fbe0: 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42  B..**.**    AgtB
fbf0: 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
fc00: 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
fc10: 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
fc20: 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a  nes and A>B..**.
fc30: 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43  **    EofA:    C
fc40: 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
fc50: 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
fc60: 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a  m selectA..**.**
fc70: 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c      EofB:    Cal
fc80: 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
fc90: 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
fca0: 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54  selectB..**.** T
fcb0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
fcc0: 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20  n of the latter 
fcd0: 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73  five subroutines
fce0: 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68   depend on which
fcf0: 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20   .** <operator> 
fd00: 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a  is used:.**.**.*
fd10: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
fd20: 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20  ION ALL         
fd30: 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20  UNION           
fd40: 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20   EXCEPT         
fd50: 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20   INTERSECT.**   
fd60: 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
fd70: 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
fd80: 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
fd90: 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
fda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
fdb0: 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AltB:   outA, ne
fdc0: 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
fdd0: 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
fde0: 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
fdf0: 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71  extA.**.**   Aeq
fe00: 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
fe10: 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
fe20: 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41             nextA
fe30: 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e           outA, n
fe40: 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74  extA.**.**   Agt
fe50: 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  B:   outB, nextB
fe60: 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
fe70: 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42  B          nextB
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
fe90: 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20  B.**.**   EofA: 
fea0: 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
feb0: 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
fec0: 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20          halt    
fed0: 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
fee0: 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75  .**   EofB:   ou
fef0: 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
ff00: 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
ff10: 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
ff20: 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
ff30: 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71  In the AltB, Aeq
ff40: 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72  B, and AgtB subr
ff50: 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20  outines, an EOF 
ff60: 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on A following n
ff70: 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61  extA.** causes a
ff80: 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
ff90: 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20   to EofA and an 
ffa0: 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69  EOF on B followi
ffb0: 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a  ng nextB causes.
ffc0: 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  ** an immediate 
ffd0: 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57  jump to EofB.  W
ffe0: 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45  ithin EofA and E
fff0: 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20  ofB, and EOF on 
10000 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c  entry or.** foll
10010 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73  owing nextX caus
10020 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65  es a jump to the
10030 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65   end of the sele
10040 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  ct processing..*
10050 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72  *.** Duplicate r
10060 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e  emoval in the UN
10070 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
10080 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73   INTERSECT cases
10090 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77   is handled.** w
100a0 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ithin the output
100b0 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68   subroutine.  Th
100c0 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74  e regPrev regist
100d0 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65  er set holds the
100e0 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f   previously.** o
100f0 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20  utput value.  A 
10100 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61  comparison is ma
10110 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  de against this 
10120 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75  value and the ou
10130 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70  tput.** is skipp
10140 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72  ed if the next r
10150 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20  esults would be 
10160 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
10170 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20  previous..**.** 
10180 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
10190 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d  on plan is to im
101a0 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20  plement the two 
101b0 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73  coroutines and s
101c0 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69  even.** subrouti
101d0 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20  nes first, then 
101e0 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20  put the control 
101f0 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74  logic at the bot
10200 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  tom.  Like this:
10210 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
10220 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20  goto Init.**    
10230 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coA: coroutine 
10240 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28  for left query (
10250 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63  A).**     coB: c
10260 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
10270 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20  ht query (B).** 
10280 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20     outA: output 
10290 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20  one row of A.** 
102a0 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20     outB: output 
102b0 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e  one row of B (UN
102c0 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c  ION and UNION AL
102d0 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f  L only).**    Eo
102e0 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f  fA: ....**    Eo
102f0 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c  fB: ....**    Al
10300 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65  tB: ....**    Ae
10310 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67  qB: ....**    Ag
10320 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e  tB: ....**    In
10330 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  it: initialize c
10340 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65  oroutine registe
10350 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  rs.**          y
10360 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20  ield coA.**     
10370 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67       if eof(A) g
10380 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20  oto EofA.**     
10390 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a       yield coB.*
103a0 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
103b0 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a  f(B) goto EofB.*
103c0 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61  *    Cmpr: Compa
103d0 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20  re A, B.**      
103e0 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41      Jump AltB, A
103f0 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20  eqB, AgtB.**    
10400 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20   End: ....**.** 
10410 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65  We call AltB, Ae
10420 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20  qB, AgtB, EofA, 
10430 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75  and EofB "subrou
10440 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20  tines" but they 
10450 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61  are not.** actua
10460 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67  lly called using
10470 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20   Gosub and they 
10480 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20  do not Return.  
10490 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f  EofA and EofB lo
104a0 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20  op.** until all 
104b0 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
104c0 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74  d then jump to t
104d0 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20  he "end" labe.  
104e0 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61  AltB, AeqB,.** a
104f0 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20  nd AgtB jump to 
10500 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20  either L2 or to 
10510 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45  one of EofA or E
10520 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ofB..*/.#ifndef 
10530 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
10540 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74  OUND_SELECT.stat
10550 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
10560 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
10570 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
10580 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
10590 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
105a0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
105b0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
105c0 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
105d0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
105e0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
105f0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
10600 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
10610 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
10620 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
10630 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
10640 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ters */.  Select
10650 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
10660 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
10670 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
10680 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
10690 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
106a0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
106b0 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
106c0 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
106d0 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a  st destA;     /*
106e0 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
106f0 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a   coroutine A */.
10700 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
10710 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tB;     /* Desti
10720 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
10730 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20  tine B */.  int 
10740 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20  regAddrA;       
10750 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
10760 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
10770 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
10780 20 20 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20    int regEofA;  
10790 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
107a0 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e  to indicate when
107b0 20 73 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d   select-A is com
107c0 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72  plete */.  int r
107d0 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
107e0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
107f0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
10800 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
10810 20 69 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20   int regEofB;   
10820 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74         /* Flag t
10830 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20  o indicate when 
10840 73 65 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70  select-B is comp
10850 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  lete */.  int ad
10860 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20  drSelectA;      
10870 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
10880 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  e select-A corou
10890 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
108a0 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20  drSelectB;      
108b0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
108c0 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  e select-B corou
108d0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
108e0 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20  gOutA;          
108f0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
10900 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
10910 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
10920 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42  */.  int regOutB
10930 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
10940 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
10950 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  or the output-B 
10960 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
10970 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20  int addrOutA;   
10980 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10990 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41   of the output-A
109a0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
109b0 20 69 6e 74 20 61 64 64 72 4f 75 74 42 3b 20 20   int addrOutB;  
109c0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
109d0 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
109e0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
109f0 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20    int addrEofA; 
10a00 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
10a10 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
10a20 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -A-exhausted sub
10a30 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10a40 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20   addrEofB;      
10a50 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
10a60 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78   the select-B-ex
10a70 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
10a80 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
10a90 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AltB;         /*
10aa0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
10ab0 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A<B subroutine *
10ac0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42  /.  int addrAeqB
10ad0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
10ae0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42  ress of the A==B
10af0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
10b00 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20   int addrAgtB;  
10b10 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
10b20 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62  s of the A>B sub
10b30 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10b40 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20   regLimitA;     
10b50 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
10b60 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
10b70 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  A */.  int regLi
10b80 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitB;        /* 
10b90 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
10ba0 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
10bb0 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
10bc0 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67         /* A rang
10bd0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
10be0 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20  o hold previous 
10bf0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
10c00 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20  savedLimit;     
10c10 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
10c20 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f   of p->iLimit */
10c30 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73  .  int savedOffs
10c40 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  et;      /* Save
10c50 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f  d value of p->iO
10c60 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  ffset */.  int l
10c70 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20  abelCmpr;       
10c80 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
10c90 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
10ca0 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a  erge algorithm *
10cb0 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64  /.  int labelEnd
10cc0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  ;         /* Lab
10cd0 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  el for the end o
10ce0 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45  f the overall SE
10cf0 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69  LECT stmt */.  i
10d00 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
10d10 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73       /* Jump ins
10d20 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67  tructions that g
10d30 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a  et retargetted *
10d40 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
10d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
10d60 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55   of TK_ALL, TK_U
10d70 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
10d80 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f   TK_INTERSECT */
10d90 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
10da0 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70  Dup = 0; /* Comp
10db0 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
10dc0 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  on for duplicate
10dd0 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65   removal */.  Ke
10de0 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65  yInfo *pKeyMerge
10df0 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  ;   /* Compariso
10e00 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
10e10 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a  r merging rows *
10e20 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
10e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
10e40 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10e50 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
10e60 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54  pOrderBy;   /* T
10e70 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
10e80 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  se */.  int nOrd
10e90 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
10ea0 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
10eb0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
10ec0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
10ed0 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
10ee0 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
10ef0 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  om ORDER BY term
10f00 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20  s to result set 
10f10 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73  columns */..  as
10f20 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
10f30 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y!=0 );.  assert
10f40 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20  ( pKeyDup==0 ); 
10f50 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64  /* "Managed" cod
10f60 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54  e needs this.  T
10f70 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a  icket #3382. */.
10f80 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
10f90 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  b;.  v = pParse-
10fa0 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d  >pVdbe;.  if( v=
10fb0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
10fc0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6c 61 62 65  TE_NOMEM;.  labe
10fd0 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  lEnd = sqlite3Vd
10fe0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
10ff0 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71    labelCmpr = sq
11000 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11010 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61  el(v);...  /* Pa
11020 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52  tch up the ORDER
11030 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a   BY clause.  */.
11040 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a    op = p->op;  .
11050 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
11060 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rior;.  assert( 
11070 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
11080 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42  ==0 );.  pOrderB
11090 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
110a0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
110b0 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42  rBy );.  nOrderB
110c0 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
110d0 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f  xpr;..  /* For o
110e0 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74  perators other t
110f0 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65  han UNION ALL we
11100 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75   have to make su
11110 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  re that.  ** the
11120 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
11130 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65   covers every te
11140 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rm of the result
11150 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20   set.  Add.  ** 
11160 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44  terms to the ORD
11170 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20  ER BY clause as 
11180 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
11190 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c    if( op!=TK_ALL
111a0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
111b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
111c0 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45  d==0 && i<=p->pE
111d0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
111e0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
111f0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
11200 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Item;.      for(
11210 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  j=0, pItem=pOrde
11220 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72  rBy->a; j<nOrder
11230 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; j++, pItem++
11240 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
11250 74 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3e 30  t( pItem->iCol>0
11260 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
11270 70 49 74 65 6d 2d 3e 69 43 6f 6c 3d 3d 69 20 29  pItem->iCol==i )
11280 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
11290 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72        if( j==nOr
112a0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
112b0 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
112c0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
112d0 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  e, TK_INTEGER, 0
112e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
112f0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
11300 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11310 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EM;.        pNew
11320 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e  ->flags |= EP_In
11330 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  tValue;.        
11340 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20 3d 20 69  pNew->iTable = i
11350 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
11360 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
11370 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
11380 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65  e, pOrderBy, pNe
11390 77 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  w, 0);.        p
113a0 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65  OrderBy->a[nOrde
113b0 72 42 79 2b 2b 5d 2e 69 43 6f 6c 20 3d 20 69 3b  rBy++].iCol = i;
113c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
113d0 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
113e0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
113f0 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20  permutation and 
11400 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20  keyinfo that is 
11410 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74  used with.  ** t
11420 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 69  he permutation i
11430 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 61  n order to compa
11440 72 69 73 6f 6e 73 20 74 6f 20 64 65 74 65 72 6d  risons to determ
11450 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a  ine if the next.
11460 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75    ** row of resu
11470 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73  lts comes from s
11480 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74  electA or select
11490 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70  B.  Also add exp
114a0 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  licit.  ** colla
114b0 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44  tions to the ORD
114c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
114d0 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20  ms so that when 
114e0 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20  the subqueries. 
114f0 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74   ** to the right
11500 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72   and the left ar
11510 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65  e evaluated, the
11520 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63  y use the correc
11530 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
11540 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74  ..  */.  aPermut
11550 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
11560 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
11570 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29  f(int)*nOrderBy)
11580 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65  ;.  if( aPermute
11590 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
115a0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
115b0 74 65 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  tem;.    for(i=0
115c0 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
115d0 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b  ->a; i<nOrderBy;
115e0 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
115f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
11600 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 20 26 26 20  tem->iCol>0  && 
11610 70 49 74 65 6d 2d 3e 69 43 6f 6c 3c 3d 70 2d 3e  pItem->iCol<=p->
11620 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
11630 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b  .      aPermute[
11640 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 69 43 6f 6c  i] = pItem->iCol
11650 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
11660 70 4b 65 79 4d 65 72 67 65 20 3d 0a 20 20 20 20  pKeyMerge =.    
11670 20 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f    sqlite3DbMallo
11680 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
11690 2a 70 4b 65 79 4d 65 72 67 65 29 2b 6e 4f 72 64  *pKeyMerge)+nOrd
116a0 65 72 42 79 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  erBy*(sizeof(Col
116b0 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 20 20  lSeq*)+1));.    
116c0 69 66 28 20 70 4b 65 79 4d 65 72 67 65 20 29 7b  if( pKeyMerge ){
116d0 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65  .      pKeyMerge
116e0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
116f0 75 38 2a 29 26 70 4b 65 79 4d 65 72 67 65 2d 3e  u8*)&pKeyMerge->
11700 61 43 6f 6c 6c 5b 6e 4f 72 64 65 72 42 79 5d 3b  aColl[nOrderBy];
11710 0a 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65  .      pKeyMerge
11720 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 4f 72 64 65  ->nField = nOrde
11730 72 42 79 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d  rBy;.      pKeyM
11740 65 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  erge->enc = ENC(
11750 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  db);.      for(i
11760 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
11770 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  i++){.        Co
11780 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
11790 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
117a0 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  m = pOrderBy->a[
117b0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
117c0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
117d0 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61  gs & EP_ExpColla
117e0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
117f0 70 43 6f 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  pColl = pTerm->p
11800 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  Coll;.        }e
11810 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
11820 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
11830 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
11840 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b 69 5d  , p, aPermute[i]
11850 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  );.          pTe
11860 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  rm->flags |= EP_
11870 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  ExpCollate;.    
11880 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 43 6f        pTerm->pCo
11890 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  ll = pColl;.    
118a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4b      }.        pK
118b0 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69  eyMerge->aColl[i
118c0 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
118d0 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53     pKeyMerge->aS
118e0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f  ortOrder[i] = pO
118f0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72  rderBy->a[i].sor
11900 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a  tOrder;.      }.
11910 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
11920 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30     pKeyMerge = 0
11930 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74  ;.  }..  /* Reat
11940 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
11950 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  Y clause to the 
11960 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d  query..  */.  p-
11970 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
11980 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  erBy;.  pPrior->
11990 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
119a0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50  e3ExprListDup(pP
119b0 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72  arse->db, pOrder
119c0 42 79 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  By);..  /* Alloc
119d0 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74  ate a range of t
119e0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
119f0 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e  rs and the KeyIn
11a00 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66  fo needed.  ** f
11a10 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  or the logic tha
11a20 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63  t removes duplic
11a30 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20  ate result rows 
11a40 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70  when the.  ** op
11a50 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c  erator is UNION,
11a60 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
11a70 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55  RSECT (but not U
11a80 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a  NION ALL)..  */.
11a90 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
11aa0 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20   ){.    regPrev 
11ab0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
11ac0 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d    int nExpr = p-
11ad0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
11ae0 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64      assert( nOrd
11af0 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64  erBy>=nExpr || d
11b00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11b10 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  );.    regPrev =
11b20 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
11b30 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78  ange(pParse, nEx
11b40 70 72 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  pr+1);.    sqlit
11b50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11b60 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
11b70 65 67 50 72 65 76 29 3b 0a 20 20 20 20 70 4b 65  egPrev);.    pKe
11b80 79 44 75 70 20 3d 20 73 71 6c 69 74 65 33 44 62  yDup = sqlite3Db
11b90 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20  MallocZero(db,. 
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bb0 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 44 75 70   sizeof(*pKeyDup
11bc0 29 20 2b 20 6e 45 78 70 72 2a 28 73 69 7a 65 6f  ) + nExpr*(sizeo
11bd0 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 20 29  f(CollSeq*)+1) )
11be0 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75  ;.    if( pKeyDu
11bf0 70 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 44  p ){.      pKeyD
11c00 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  up->aSortOrder =
11c10 20 28 75 38 2a 29 26 70 4b 65 79 44 75 70 2d 3e   (u8*)&pKeyDup->
11c20 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20  aColl[nExpr];.  
11c30 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 6e 46 69      pKeyDup->nFi
11c40 65 6c 64 20 3d 20 6e 45 78 70 72 3b 0a 20 20 20  eld = nExpr;.   
11c50 20 20 20 70 4b 65 79 44 75 70 2d 3e 65 6e 63 20     pKeyDup->enc 
11c60 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20  = ENC(db);.     
11c70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
11c80 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
11c90 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b   pKeyDup->aColl[
11ca0 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  i] = multiSelect
11cb0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
11cc0 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70  p, i);.        p
11cd0 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64  KeyDup->aSortOrd
11ce0 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  er[i] = 0;.     
11cf0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20   }.    }.  }. . 
11d00 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65   /* Separate the
11d10 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69   left and the ri
11d20 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f  ght query from o
11d30 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a  ne another.  */.
11d40 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
11d50 0a 20 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68  .  pPrior->pRigh
11d60 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 73 71 6c  tmost = 0;.  sql
11d70 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
11d80 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
11d90 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  p, p->pOrderBy, 
11da0 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20  "ORDER");.  if( 
11db0 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
11dc0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
11dd0 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
11de0 70 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69  pBy(pParse, pPri
11df0 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  or, pPrior->pOrd
11e00 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
11e10 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
11e20 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69  e the limit regi
11e30 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75  sters */.  compu
11e40 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
11e50 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65  (pParse, p, labe
11e60 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lEnd);.  if( p->
11e70 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b  iLimit && op==TK
11e80 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c  _ALL ){.    regL
11e90 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  imitA = ++pParse
11ea0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c  ->nMem;.    regL
11eb0 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  imitB = ++pParse
11ec0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
11ed0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11ee0 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66   OP_Copy, p->iOf
11ef0 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65  fset ? p->iOffse
11f00 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c  t+1 : p->iLimit,
11f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f30 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20     regLimitA);. 
11f40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11f50 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
11f60 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c   regLimitA, regL
11f70 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  imitB);.  }else{
11f80 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
11f90 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a   regLimitB = 0;.
11fa0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
11fb0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
11fc0 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69  Limit);.  p->pLi
11fd0 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  mit = 0;.  sqlit
11fe0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
11ff0 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
12000 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
12010 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b  .  regAddrA = ++
12020 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12030 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72  regEofA = ++pPar
12040 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41  se->nMem;.  regA
12050 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrB = ++pParse-
12060 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42  >nMem;.  regEofB
12070 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
12080 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b  m;.  regOutA = +
12090 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
120a0 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61   regOutB = ++pPa
120b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
120c0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
120d0 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43  it(&destA, SRT_C
120e0 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
120f0 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  rA);.  sqlite3Se
12100 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
12110 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stB, SRT_Corouti
12120 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  ne, regAddrB);..
12130 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74    /* Jump past t
12140 68 65 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f  he various subro
12150 75 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75  utines and corou
12160 74 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69  tines to the mai
12170 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f  n.  ** merge loo
12180 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71  p.  */.  j1 = sq
12190 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
121a0 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61  v, OP_Goto);.  a
121b0 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c  ddrSelectA = sql
121c0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
121d0 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47  ddr(v);...  /* G
121e0 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
121f0 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
12200 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
12210 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ment to the.  **
12220 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d   left of the com
12230 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d  pound operator -
12240 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e   the "A" select.
12250 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
12260 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67  Comment((v, "Beg
12270 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  in coroutine for
12280 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b   left SELECT"));
12290 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69  .  pPrior->iLimi
122a0 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20  t = regLimitA;. 
122b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
122c0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
122d0 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  destA);.  sqlite
122e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
122f0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65  P_Integer, 1, re
12300 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65  gEofA);.  sqlite
12310 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12320 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
12330 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f  A);.  VdbeNoopCo
12340 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63  mment((v, "End c
12350 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66  oroutine for lef
12360 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20  t SELECT"));..  
12370 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
12380 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
12390 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
123a0 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a  tatement on .  *
123b0 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68  * the right - th
123c0 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a  e "B" select.  *
123d0 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20  /.  addrSelectB 
123e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
123f0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 56  rentAddr(v);.  V
12400 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
12410 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74  v, "Begin corout
12420 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 53 45  ine for right SE
12430 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64  LECT"));.  saved
12440 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
12450 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74  t;.  savedOffset
12460 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
12470 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67   p->iLimit = reg
12480 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66  LimitB;.  p->iOf
12490 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 73 71  fset = 0;  .  sq
124a0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
124b0 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a  se, p, &destB);.
124c0 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61    p->iLimit = sa
124d0 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69  vedLimit;.  p->i
124e0 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66  Offset = savedOf
124f0 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56  fset;.  sqlite3V
12500 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12510 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45  Integer, 1, regE
12520 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
12530 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12540 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29  Yield, regAddrB)
12550 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
12560 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72  ent((v, "End cor
12570 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
12580 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f   SELECT"));..  /
12590 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
125a0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
125b0 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
125c0 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20   row of the A.  
125d0 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
125e0 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
125f0 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
12600 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
12610 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
12620 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
12630 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20  ine for A"));.  
12640 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72  addrOutA = gener
12650 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
12660 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ine(pParse,.    
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
12680 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72  &destA, pDest, r
12690 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20  egOutA,.        
126a0 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76           regPrev
126b0 2c 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45  , pKeyDup, P4_KE
126c0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c  YINFO_HANDOFF, l
126d0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f  abelEnd);.  .  /
126e0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
126f0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
12700 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
12710 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20   row of the B.  
12720 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
12730 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
12740 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
12750 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
12760 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
12770 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
12780 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
12790 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
127a0 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22  t routine for B"
127b0 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42  ));.    addrOutB
127c0 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
127d0 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
127e0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
127f0 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20       p, &destB, 
12800 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a  pDest, regOutB,.
12810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12820 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
12830 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54  p, P4_KEYINFO_ST
12840 41 54 49 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ATIC, labelEnd);
12850 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
12860 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
12870 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
12880 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
12890 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20  lect A.  ** are 
128a0 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
128b0 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
128c0 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t B remains..  *
128d0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
128e0 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73  ent((v, "eof-A s
128f0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
12900 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50  if( op==TK_EXCEP
12910 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
12920 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
12930 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
12940 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12950 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e  Goto, 0, labelEn
12960 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  d);.  }else{  . 
12970 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
12980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12990 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
129a0 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  B, labelEnd);.  
129b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
129c0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
129d0 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
129e0 74 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tB);.    sqlite3
129f0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12a00 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
12a10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12a20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
12a30 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41  oto, 0, addrEofA
12a40 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
12a50 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
12a60 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
12a70 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
12a80 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72  select B.  ** ar
12a90 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
12aa0 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
12ab0 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20  ect A remains.. 
12ac0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
12ad0 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
12ae0 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64    addrEofB = add
12af0 72 45 6f 66 41 3b 0a 20 20 7d 65 6c 73 65 7b 20  rEofA;.  }else{ 
12b00 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
12b10 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42  mment((v, "eof-B
12b20 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
12b30 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73      addrEofB = s
12b40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12b50 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
12b60 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  fA, labelEnd);. 
12b70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12b80 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
12b90 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
12ba0 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utA);.    sqlite
12bb0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12bc0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
12bd0 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
12be0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12bf0 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66  Goto, 0, addrEof
12c00 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  B);.  }..  /* Ge
12c10 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
12c20 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
12c30 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A<B.  */.  Vdb
12c40 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
12c50 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74   "A-lt-B subrout
12c60 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c  ine"));.  addrAl
12c70 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
12c80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
12c90 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
12ca0 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  rOutA);.  sqlite
12cb0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12cc0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
12cd0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
12ce0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
12cf0 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
12d00 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
12d10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12d20 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d  Goto, 0, labelCm
12d30 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  pr);..  /* Gener
12d40 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
12d50 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
12d60 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ==B.  */.  if( o
12d70 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
12d80 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
12d90 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66  AltB;.  }else if
12da0 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
12db0 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  CT ){.    addrAe
12dc0 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
12dd0 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20     addrAltB++;. 
12de0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
12df0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
12e00 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69  "A-eq-B subrouti
12e10 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41  ne"));.    addrA
12e20 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65  eqB =.    sqlite
12e30 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12e40 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
12e50 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
12e60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12e70 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64  If, regEofA, add
12e80 72 45 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69  rEofA);.    sqli
12e90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12ea0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
12eb0 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  elCmpr);.  }..  
12ec0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
12ed0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
12ee0 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a  ase of A>B.  */.
12ef0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12f00 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75  t((v, "A-gt-B su
12f10 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
12f20 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65  ddrAgtB = sqlite
12f30 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
12f40 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  (v);.  if( op==T
12f50 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
12f60 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  UNION ){.    sql
12f70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12f80 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
12f90 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
12fa0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
12fb0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
12fc0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  eld, regAddrB);.
12fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12fe0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
12ff0 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29  gEofB, addrEofB)
13000 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13010 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
13020 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  , 0, labelCmpr);
13030 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
13040 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e   runs once to in
13050 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68  itialize everyth
13060 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ing..  */.  sqli
13070 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13080 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65  v, j1);.  sqlite
13090 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
130a0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
130b0 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65  gEofA);.  sqlite
130c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
130d0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
130e0 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65  gEofB);.  sqlite
130f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13100 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72  P_Gosub, regAddr
13110 41 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b  A, addrSelectA);
13120 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13130 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
13140 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
13150 53 65 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69  SelectB);.  sqli
13160 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13170 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c   OP_If, regEofA,
13180 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71   addrEofA);.  sq
13190 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
131a0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
131b0 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20  B, addrEofB);.. 
131c0 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68   /* Implement th
131d0 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f  e main merge loo
131e0 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
131f0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
13200 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
13210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13220 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74  Op4(v, OP_Permut
13230 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  ation, 0, 0, 0, 
13240 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c  (char*)aPermute,
13250 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20   P4_INTARRAY);. 
13260 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13270 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
13280 2c 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65  , destA.iMem, de
13290 73 74 42 2e 69 4d 65 6d 2c 20 6e 4f 72 64 65 72  stB.iMem, nOrder
132a0 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
132c0 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
132d0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
132e0 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  F);.  sqlite3Vdb
132f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
13300 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
13310 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
13320 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
13330 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
13340 74 65 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ters.  */.  if( 
13350 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 73  regPrev ){.    s
13360 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
13370 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
13380 65 67 50 72 65 76 2c 20 6e 4f 72 64 65 72 42 79  egPrev, nOrderBy
13390 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  +1);.  }..  /* J
133a0 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20  ump to the this 
133b0 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
133c0 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
133d0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  query..  */.  sq
133e0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
133f0 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e  Label(v, labelEn
13400 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  d);..  /* Set th
13410 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
13420 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ut columns.  */.
13430 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
13440 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
13450 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46  {.    Select *pF
13460 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20  irst = pPrior;. 
13470 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
13480 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
13490 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
134a0 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65  or;.    generate
134b0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
134c0 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
134d0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  EList);.  }..  /
134e0 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
134f0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
13500 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
13510 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
13520 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
13530 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
13540 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
13550 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
13560 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
13570 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
13580 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
13590 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20  pPrior;..  /*** 
135a0 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62  TBD:  Insert sub
135b0 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f  routine calls to
135c0 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f   close cursors o
135d0 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a  n incomplete.  *
135e0 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a  *** subqueries *
135f0 2a 2a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51  ***/.  return SQ
13600 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
13610 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
13620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
13630 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
13640 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
13650 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44  EW)./* Forward D
13660 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  eclarations */.s
13670 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
13680 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33  ExprList(sqlite3
13690 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e  *, ExprList*, in
136a0 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  t, ExprList*);.s
136b0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
136c0 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c  Select(sqlite3*,
136d0 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20   Select *, int, 
136e0 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a  ExprList *);../*
136f0 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
13700 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
13710 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
13720 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
13730 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
13740 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
13750 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
13760 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
13770 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
13780 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
13790 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
137a0 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
137b0 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
137c0 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
137d0 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
137e0 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
137f0 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
13800 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
13810 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
13820 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
13830 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
13840 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
13850 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
13860 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
13870 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
13880 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
13890 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
138a0 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
138b0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
138c0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
138d0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
138e0 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
138f0 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
13900 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
13910 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
13920 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
13930 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
13940 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
13950 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
13960 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  tExpr(.  sqlite3
13970 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
13980 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
13990 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e  rors to this con
139a0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
139b0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
139c0 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
139d0 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
139e0 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ccurs */.  int i
139f0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Table,         /
13a00 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
13a10 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
13a20 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
13a30 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
13a40 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
13a50 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
13a60 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
13a70 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
13a80 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
13a90 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
13aa0 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
13ab0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
13ac0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
13ad0 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
13ae0 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
13af0 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73  *pNew;.      ass
13b00 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26  ert( pEList!=0 &
13b10 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
13b20 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
13b30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13b40 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
13b50 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
13b60 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c  ==0 && pExpr->pL
13b70 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
13b80 70 4e 65 77 20 3d 20 70 45 4c 69 73 74 2d 3e 61  pNew = pEList->a
13b90 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
13ba0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
13bb0 73 65 72 74 28 20 70 4e 65 77 21 3d 30 20 29 3b  sert( pNew!=0 );
13bc0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
13bd0 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20 20   = pNew->op;.   
13be0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
13bf0 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b 0a 20 20  ->pLeft==0 );.  
13c00 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
13c10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
13c20 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 65 66  p(db, pNew->pLef
13c30 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
13c40 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  ( pExpr->pRight=
13c50 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
13c60 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r->pRight = sqli
13c70 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
13c80 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  New->pRight);.  
13c90 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
13ca0 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20  r->pList==0 );. 
13cb0 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73       pExpr->pLis
13cc0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
13cd0 69 73 74 44 75 70 28 64 62 2c 20 70 4e 65 77 2d  istDup(db, pNew-
13ce0 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  >pList);.      p
13cf0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
13d00 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  New->iTable;.   
13d10 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
13d20 20 70 4e 65 77 2d 3e 70 54 61 62 3b 0a 20 20 20   pNew->pTab;.   
13d30 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
13d40 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f 6c 75 6d  n = pNew->iColum
13d50 6e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  n;.      pExpr->
13d60 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e 69 41 67  iAgg = pNew->iAg
13d70 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  g;.      sqlite3
13d80 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
13d90 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 26 70 4e  Expr->token, &pN
13da0 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  ew->token);.    
13db0 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
13dc0 70 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 73  py(db, &pExpr->s
13dd0 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73 70 61 6e  pan, &pNew->span
13de0 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
13df0 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
13e00 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
13e10 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  New->pSelect);. 
13e20 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67       pExpr->flag
13e30 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61 67 73 3b  s = pNew->flags;
13e40 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
13e50 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62      substExpr(db
13e60 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
13e70 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
13e80 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64  .    substExpr(d
13e90 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  b, pExpr->pRight
13ea0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
13eb0 29 3b 0a 20 20 20 20 73 75 62 73 74 53 65 6c 65  );.    substSele
13ec0 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 53  ct(db, pExpr->pS
13ed0 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70  elect, iTable, p
13ee0 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
13ef0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
13f00 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69 54 61 62  xpr->pList, iTab
13f10 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  le, pEList);.  }
13f20 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
13f30 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
13f40 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
13f50 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
13f60 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
13f70 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
13f80 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c  *pList,     /* L
13f90 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20  ist to scan and 
13fa0 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
13fb0 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a   substitutes */.
13fc0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
13fd0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
13fe0 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65  to be substitute
13ff0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
14000 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
14010 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
14020 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
14030 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14040 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
14050 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
14060 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 75  pr; i++){.    su
14070 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73  bstExpr(db, pLis
14080 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
14090 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
140a0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
140b0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
140c0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
140d0 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
140e0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
140f0 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
14100 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
14110 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
14120 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
14130 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
14140 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
14150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
14160 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  le to be replace
14170 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
14180 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
14190 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
141a0 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
141b0 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74   *pSrc;.  struct
141c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
141d0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
141e0 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
141f0 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
14200 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  t(db, p->pEList,
14210 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
14220 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
14230 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  t(db, p->pGroupB
14240 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
14250 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
14260 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ist(db, p->pOrde
14270 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
14280 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
14290 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  r(db, p->pHaving
142a0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
142b0 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 28 64  );.  substExpr(d
142c0 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54  b, p->pWhere, iT
142d0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
142e0 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
142f0 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62   p->pPrior, iTab
14300 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70  le, pEList);.  p
14310 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
14320 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20   if( pSrc ){.   
14330 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
14340 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61  c, pItem=pSrc->a
14350 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
14360 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73  m++){.      subs
14370 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65  tSelect(db, pIte
14380 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  m->pSelect, iTab
14390 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
143a0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20   }.  }.}.#endif 
143b0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
143c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
143d0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
143e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
143f0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
14400 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
14410 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
14420 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
14430 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  IEW)./*.** This 
14440 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
14450 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
14460 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72 20  ueries in order 
14470 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65 63  to speed.** exec
14480 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75 72  ution.  It retur
14490 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
144a0 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
144b0 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 0a  f no flattening.
144c0 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ** occurs..**.**
144d0 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74   To understand t
144e0 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c  he concept of fl
144f0 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64  attening, consid
14500 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
14510 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  .** query:.**.**
14520 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
14530 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41  OM (SELECT x+y A
14540 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
14550 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61  E z<100) WHERE a
14560 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  >5.**.** The def
14570 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c  ault way of impl
14580 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75  ementing this qu
14590 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74  ery is to execut
145a0 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72  e the.** subquer
145b0 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72  y first and stor
145c0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
145d0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
145e0 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20  le, then.** run 
145f0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
14600 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72  on that temporar
14610 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  y table.  This r
14620 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70  equires two.** p
14630 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64  asses over the d
14640 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72  ata.  Furthermor
14650 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74  e, because the t
14660 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a  emporary table.*
14670 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  * has no indices
14680 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  , the WHERE clau
14690 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20  se on the outer 
146a0 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a  query cannot be.
146b0 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a  ** optimized..**
146c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
146d0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77   attempts to rew
146e0 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63  rite queries suc
146f0 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69  h as the above i
14700 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
14710 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b  flat select, lik
14720 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
14730 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20    SELECT x+y AS 
14740 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
14750 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a  z<100 AND a>5.**
14760 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
14770 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  erated for this 
14780 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69  simpification gi
14790 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
147a0 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
147b0 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
147c0 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
147d0 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
147e0 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
147f0 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
14800 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
14810 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
14820 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
14830 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
14840 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d  ng is only attem
14850 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74  pted if all of t
14860 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
14870 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28   true:.**.**   (
14880 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
14890 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
148a0 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
148b0 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e   use aggregates.
148c0 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68  .**.**   (2)  Th
148d0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
148e0 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
148f0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
14900 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
14910 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68  .**.**   (3)  Th
14920 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
14930 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  t the right oper
14940 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
14950 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20  ter join.**     
14960 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74     (Originally t
14970 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72  icket #306.  Str
14980 65 6e 67 68 74 65 6e 65 64 20 62 79 20 74 69 63  enghtened by tic
14990 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a  ket #3300).**.**
149a0 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
149b0 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
149c0 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74 65  INCT or the oute
149d0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
149e0 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
149f0 35 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  5)  The subquery
14a00 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
14a10 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
14a20 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
14a30 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
14a40 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
14a50 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
14a60 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
14a70 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
14a80 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
14a90 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
14aa0 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
14ab0 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
14ac0 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
14ad0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  se..**.**   (8) 
14ae0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
14af0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
14b00 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
14b10 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
14b20 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
14b30 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
14b40 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
14b50 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
14b60 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
14b70 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
14b80 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30  ates..**.**  (10
14b90 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
14ba0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
14bb0 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
14bc0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
14bd0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
14be0 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
14bf0 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
14c00 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
14c10 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
14c20 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
14c30 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
14c40 20 28 31 32 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (12)  Not imple
14c50 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
14c60 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
14c70 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
14c80 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
14c90 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
14ca0 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
14cb0 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
14cc0 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
14cd0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
14ce0 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  d outer query do
14cf0 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
14d00 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20  MIT.**.**  (14) 
14d10 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
14d20 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  es not use OFFSE
14d30 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54  T.**.**  (15)  T
14d40 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
14d50 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
14d60 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
14d70 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  or the.**       
14d80 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
14d90 6f 74 20 68 61 76 65 20 62 6f 74 68 20 61 6e 20  ot have both an 
14da0 4f 52 44 45 52 20 42 59 20 61 6e 64 20 61 20 4c  ORDER BY and a L
14db0 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  IMIT clause..** 
14dc0 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b         (See tick
14dd0 65 74 20 23 32 33 33 39 29 0a 2a 2a 0a 2a 2a 20  et #2339).**.** 
14de0 20 28 31 36 29 20 20 54 68 65 20 6f 75 74 65 72   (16)  The outer
14df0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e   query is not an
14e00 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
14e10 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a  e subquery does.
14e20 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f  **        not co
14e30 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20  ntain ORDER BY. 
14e40 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20   (Ticket #2942) 
14e50 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f   This used to no
14e60 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20  t matter.**     
14e70 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72     until we intr
14e80 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70  oduced the group
14e90 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69  _concat() functi
14ea0 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37  on.  .**.**  (17
14eb0 29 20 20 54 68 65 20 73 75 62 2d 71 75 65 72 79  )  The sub-query
14ec0 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75   is not a compou
14ed0 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74  nd select, or it
14ee0 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   is a UNION ALL 
14ef0 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f  .**        compo
14f00 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20  und clause made 
14f10 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e  up entirely of n
14f20 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
14f30 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20  ries, and .**   
14f40 20 20 20 20 20 74 68 65 20 70 61 72 65 6e 74 20       the parent 
14f50 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
14f60 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69        * is not i
14f70 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20  tself part of a 
14f80 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
14f90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
14fa0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
14fb0 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71  te or DISTINCT q
14fc0 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  uery, and.**    
14fd0 20 20 20 20 20 20 2a 20 68 61 73 20 6e 6f 20 6f        * has no o
14fe0 74 68 65 72 20 74 61 62 6c 65 73 20 6f 72 20 73  ther tables or s
14ff0 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20 74 68  ub-selects in th
15000 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
15010 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  *.**        The 
15020 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71  parent and sub-q
15030 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  uery may contain
15040 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20   WHERE clauses. 
15050 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20  Subject to.**   
15060 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c       rules (11),
15070 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20   (13) and (14), 
15080 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f  they may also co
15090 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a  ntain ORDER BY,.
150a0 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20  **        LIMIT 
150b0 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
150c0 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20  es..**.**  (18) 
150d0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
150e0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
150f0 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c  select, then all
15100 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
15110 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62 79          ORDER by
15120 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70   clause of the p
15130 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69  arent must be si
15140 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  mple references 
15150 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f  to .**        co
15160 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62  lumns of the sub
15170 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28  -query..**.**  (
15180 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  19)  The subquer
15190 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
151a0 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
151b0 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
151c0 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
151d0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
151e0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f  **.** In this ro
151f0 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70  utine, the "p" p
15200 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
15210 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74  inter to the out
15220 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  er query..** The
15230 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e   subquery is p->
15240 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20  pSrc->a[iFrom]. 
15250 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69   isAgg is true i
15260 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
15270 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67  y.** uses aggreg
15280 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72  ates and subquer
15290 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69  yIsAgg is true i
152a0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
152b0 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a  ses aggregates..
152c0 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  **.** If flatten
152d0 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ing is not attem
152e0 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  pted, this routi
152f0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e  ne is a no-op an
15300 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20  d returns 0..** 
15310 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
15320 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20   attempted this 
15330 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
15340 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  1..**.** All of 
15350 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
15360 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63  nalysis must occ
15370 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f  ur on both the o
15380 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a  uter query and.*
15390 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62  * the subquery b
153a0 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
153b0 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74  ne runs..*/.stat
153c0 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75  ic int flattenSu
153d0 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  bquery(.  Parse 
153e0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
153f0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
15400 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
15410 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
15420 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74  he parent or out
15430 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  er SELECT statem
15440 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ent */.  int iFr
15450 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om,           /*
15460 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72   Index in p->pSr
15470 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e  c->a[] of the in
15480 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ner subquery */.
15490 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20    int isAgg,    
154a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
154b0 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75  f outer SELECT u
154c0 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
154d0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
154e0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20   subqueryIsAgg  
154f0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
15500 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
15510 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
15520 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ns */.){.  const
15530 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
15540 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
15550 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
15560 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
15570 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  nt;.  Select *pS
15580 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
15590 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
155a0 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
155b0 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20  Select *pSub1;  
155c0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
155d0 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  o the rightmost 
155e0 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75  select in sub-qu
155f0 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
15600 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
15610 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
15620 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
15630 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
15640 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
15650 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
15660 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
15670 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
15680 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72  ist;    /* The r
15690 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
156a0 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
156b0 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20    int iParent;  
156c0 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75        /* VDBE cu
156d0 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
156e0 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73  he pSub result s
156f0 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  et temp table */
15700 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
15710 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
15720 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72  ounter */.  Expr
15730 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15750 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
15760 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
15770 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69  List_item *pSubi
15780 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75  tem;   /* The su
15790 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69  bquery */.  sqli
157a0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
157b0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ->db;..  /* Chec
157c0 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74  k to see if flat
157d0 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
157e0 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ted.  Return 0 i
157f0 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  f not..  */.  as
15800 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
15810 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
15820 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
15830 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20  ->pPrior==0 );  
15840 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61  /* Unable to fla
15850 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75  tten compound qu
15860 65 72 69 65 73 20 2a 2f 0a 20 20 70 53 72 63 20  eries */.  pSrc 
15870 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  = p->pSrc;.  ass
15880 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46 72  ert( pSrc && iFr
15890 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70  om>=0 && iFrom<p
158a0 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70  Src->nSrc );.  p
158b0 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
158c0 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61  >a[iFrom];.  iPa
158d0 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  rent = pSubitem-
158e0 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62  >iCursor;.  pSub
158f0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
15900 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20  lect;.  assert( 
15910 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  pSub!=0 );.  if(
15920 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75 65   isAgg && subque
15930 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72 6e  ryIsAgg ) return
15940 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
15950 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
15960 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28  on (1)  */.  if(
15970 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 26   subqueryIsAgg &
15980 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  & pSrc->nSrc>1 )
15990 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
159a0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
159b0 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75  on (2)  */.  pSu
159c0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
159d0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  c;.  assert( pSu
159e0 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69  bSrc );.  /* Pri
159f0 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e  or to version 3.
15a00 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20  1.2, when LIMIT 
15a10 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74  and OFFSET had t
15a20 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73  o be simple cons
15a30 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20  tants,.  ** not 
15a40 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
15a50 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
15a60 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
15a70 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
15a80 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
15a90 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
15aa0 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
15ab0 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
15ac0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
15ad0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
15ae0 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
15af0 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
15b00 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
15b10 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
15b20 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
15b30 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
15b40 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
15b50 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
15b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
15b70 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
15b80 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
15b90 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20  Offset ) return 
15ba0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
15bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
15bc0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
15bd0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67  */.  if( p->pRig
15be0 68 74 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e  htmost && pSub->
15bf0 70 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d 3e  pLimit && pSub->
15c00 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
15c10 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
15c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c40 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
15c50 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a  ion (15) */.  }.
15c60 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
15c70 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
15c80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
15c90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
15ca0 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a  riction (7)  */.
15cb0 20 20 69 66 28 20 28 28 70 53 75 62 2d 3e 73 65    if( ((pSub->se
15cc0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
15cd0 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 75 62  inct)!=0 || pSub
15ce0 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20 20 20 20  ->pLimit) .     
15cf0 20 20 20 20 26 26 20 28 70 53 72 63 2d 3e 6e 53      && (pSrc->nS
15d00 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
15d10 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  {          /* Re
15d20 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 28 35  strictions (4)(5
15d30 29 28 38 29 28 39 29 20 2a 2f 0a 20 20 20 20 20  )(8)(9) */.     
15d40 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
15d50 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73  .  }.  if( (p->s
15d60 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
15d70 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62  tinct)!=0 && sub
15d80 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20  queryIsAgg ){.  
15d90 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
15da0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
15db0 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a  ion (6)  */.  }.
15dc0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
15dd0 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  y && pSub->pOrde
15de0 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75  rBy ){.     retu
15df0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
15e30 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  11) */.  }.  if(
15e40 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e   isAgg && pSub->
15e50 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72  pOrderBy ) retur
15e60 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
15e70 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
15e80 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28  on (16) */.  if(
15e90 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
15ea0 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74   p->pWhere ) ret
15eb0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
15ec0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
15ed0 6f 6e 20 28 31 39 29 20 2a 2f 0a 0a 20 20 2f 2a  on (19) */..  /*
15ee0 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
15ef0 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69  T 1:.  ** Restri
15f00 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65  ction 3:  If the
15f10 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
15f20 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  oin, make sure t
15f30 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 0a  he subquery is .
15f40 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73    ** not used as
15f50 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
15f60 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a  nd of an outer j
15f70 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f  oin.  Examples o
15f80 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20  f why this.  ** 
15f90 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
15fa0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
15fb0 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
15fc0 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33  JOIN (t2 JOIN t3
15fd0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
15fe0 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
15ff0 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
16000 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
16010 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
16020 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e  ER JOIN t2) JOIN
16030 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68   t3.  **.  ** wh
16040 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c  ich is not at al
16050 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  l the same thing
16060 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f  ..  **.  ** OBSO
16070 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a  LETE COMMENT 2:.
16080 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    ** Restriction
16090 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75 62   12:  If the sub
160a0 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
160b0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
160c0 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20  left outer.  ** 
160d0 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
160e0 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
160f0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
16100 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c  ..  ** An exampl
16110 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20 69  es of why this i
16120 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20  s not allowed:. 
16130 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
16140 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a   t1 LEFT OUTER J
16150 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52  OIN (SELECT * FR
16160 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e 78  OM t2 WHERE t2.x
16170 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  >0).  **.  ** If
16180 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20   we flatten the 
16190 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20  above, we would 
161a0 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  get.  **.  **   
161b0 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f        (t1 LEFT O
161c0 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48  UTER JOIN t2) WH
161d0 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a  ERE t2.x>0.  **.
161e0 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e    ** But the t2.
161f0 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c  x>0 test will al
16200 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e  ways fail on a N
16210 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77  ULL row of t2, w
16220 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74  hich.  ** effect
16230 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74  ively converts t
16240 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e  he OUTER JOIN in
16250 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e  to an INNER JOIN
16260 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53  ..  **.  ** THIS
16270 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c   OVERRIDES OBSOL
16280 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41  ETE COMMENTS 1 A
16290 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a  ND 2 ABOVE:.  **
162a0 20 54 69 63 6b 65 74 20 23 33 33 30 30 20 73 68   Ticket #3300 sh
162b0 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e  ows that flatten
162c0 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 74 65  ing the right te
162d0 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
162e0 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68  N.  ** is fraugh
162f0 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20  t with danger.  
16300 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68  Best to avoid th
16310 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20  e whole thing.  
16320 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  If the.  ** subq
16330 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
16340 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
16350 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e   JOIN, then do n
16360 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f  ot flatten..  */
16370 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d  .  if( (pSubitem
16380 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
16390 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
163a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
163b0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
163c0 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d   17: If the sub-
163d0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
163e0 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e  und SELECT, then
163f0 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73   it must.  ** us
16400 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e  e only the UNION
16410 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41   ALL operator. A
16420 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  nd none of the s
16430 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65  imple select que
16440 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d  ries.  ** that m
16450 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f  ake up the compo
16460 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61  und SELECT are a
16470 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67  llowed to be agg
16480 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e  regate or distin
16490 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ct.  ** queries.
164a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
164b0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
164c0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 7c 7c  if( p->pPrior ||
164d0 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65   isAgg || (p->se
164e0 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
164f0 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63  inct)!=0 || pSrc
16500 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20  ->nSrc!=1 ){.   
16510 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
16520 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31   }.    for(pSub1
16530 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53  =pSub; pSub1; pS
16540 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f  ub1=pSub1->pPrio
16550 72 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  r){.      if( (p
16560 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
16570 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
16580 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a  _Aggregate))!=0.
16590 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
165a0 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
165b0 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a  1->op!=TK_ALL) .
165c0 20 20 20 20 20 20 20 7c 7c 20 21 70 53 75 62 31         || !pSub1
165d0 2d 3e 70 53 72 63 20 7c 7c 20 70 53 75 62 31 2d  ->pSrc || pSub1-
165e0 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 0a 20  >pSrc->nSrc!=1. 
165f0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
16600 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
16610 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
16620 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20  Restriction 18. 
16630 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f  */.    if( p->pO
16640 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
16650 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
16660 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f  r(ii=0; ii<p->pO
16670 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
16680 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
16690 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ( p->pOrderBy->a
166a0 5b 69 69 5d 2e 69 43 6f 6c 3d 3d 30 20 29 20 72  [ii].iCol==0 ) r
166b0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
166c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
166d0 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
166e0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
166f0 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
16700 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20  tted. *****/..  
16710 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65  /* Authorize the
16720 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70   subquery */.  p
16730 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
16740 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ext = pSubitem->
16750 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  zName;.  sqlite3
16760 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
16770 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
16780 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 70 50 61   0, 0, 0);.  pPa
16790 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
167a0 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
167b0 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
167c0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
167d0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
167e0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
167f0 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
16800 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
16810 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
16820 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
16830 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
16840 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
16850 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
16860 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
16870 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
16880 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
16890 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
168a0 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
168b0 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
168c0 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
168d0 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
168e0 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
168f0 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
16900 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
16910 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
16920 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
16930 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
16940 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
16950 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
16960 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
16970 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
16980 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
16990 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
169a0 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
169b0 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
169c0 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
169d0 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
169e0 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
169f0 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
16a00 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
16a10 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
16a20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
16a30 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
16a40 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
16a50 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
16a60 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
16a70 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
16a80 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
16a90 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
16aa0 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
16ab0 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
16ac0 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
16ad0 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
16ae0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
16af0 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
16b00 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
16b10 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
16b20 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
16b30 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
16b40 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
16b50 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
16b60 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
16b70 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
16b80 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
16b90 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
16ba0 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
16bb0 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
16bc0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
16bd0 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
16be0 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
16bf0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
16c00 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
16c10 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
16c20 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
16c30 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
16c40 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
16c50 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
16c60 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
16c70 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
16c80 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
16c90 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
16ca0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
16cb0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
16cc0 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
16cd0 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
16ce0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
16cf0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
16d00 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
16d10 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 29  SelectDup(db, p)
16d20 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
16d30 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d  = pLimit;.    p-
16d40 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
16d50 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72  erBy;.    p->pSr
16d60 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d  c = pSrc;.    p-
16d70 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20  >op = TK_ALL;.  
16d80 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20    p->pRightmost 
16d90 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  = 0;.    if( pNe
16da0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e  w==0 ){.      pN
16db0 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  ew = pPrior;.   
16dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
16dd0 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
16de0 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  ior;.      pNew-
16df0 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b  >pRightmost = 0;
16e00 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50  .    }.    p->pP
16e10 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  rior = pNew;.   
16e20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
16e30 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
16e40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
16e50 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  n flattening the
16e60 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
16e70 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
16e80 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  se .  ** in the 
16e90 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
16ea0 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31  /.  pSub = pSub1
16eb0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
16ec0 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  lect;..  /* Dele
16ed0 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  te the transient
16ee0 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
16ef0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
16f00 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
16f10 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
16f20 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
16f30 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
16f40 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
16f50 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
16f60 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
16f70 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
16f80 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
16f90 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
16fa0 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  base = 0;.  pSub
16fb0 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  item->zName = 0;
16fc0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  .  pSubitem->zAl
16fd0 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ias = 0;.  pSubi
16fe0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30  tem->pSelect = 0
16ff0 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65  ;..  /* Defer de
17000 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65  leting the Table
17010 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
17020 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
17030 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20   subquery until 
17040 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
17050 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65  is.  ** complete
17060 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61  , since there ma
17070 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78  y still exist Ex
17080 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20  pr.pTab entries 
17090 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20  that.  ** refer 
170a0 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
170b0 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74  even after flatt
170c0 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23  ening.  Ticket #
170d0 33 33 34 36 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  3346..  */.  if(
170e0 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21   pSubitem->pTab!
170f0 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
17100 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75  *pTabToDel = pSu
17110 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bitem->pTab;.   
17120 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e   if( pTabToDel->
17130 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nRef==1 ){.     
17140 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
17150 74 5a 6f 6d 62 69 65 20 3d 20 70 50 61 72 73 65  tZombie = pParse
17160 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20  ->pZombieTab;.  
17170 20 20 20 20 70 50 61 72 73 65 2d 3e 70 5a 6f 6d      pParse->pZom
17180 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44  bieTab = pTabToD
17190 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  el;.    }else{. 
171a0 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
171b0 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nRef--;.    }.  
171c0 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62    pSubitem->pTab
171d0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
171e0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  The following lo
171f0 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
17200 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20   each term in a 
17210 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
17220 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e  y.  ** flattenin
17230 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20  g (as described 
17240 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61  above).  If we a
17250 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65  re doing a diffe
17260 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f  rent kind.  ** o
17270 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61  f flattening - a
17280 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65   flattening othe
17290 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e  r than a compoun
172a0 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
172b0 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65  ening -.  ** the
172c0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79  n this loop only
172d0 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a   runs once..  **
172e0 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
172f0 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65  moves all of the
17300 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
17310 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
17320 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
17330 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
17340 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
17350 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
17360 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
17370 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
17380 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
17390 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
173a0 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
173b0 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
173c0 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
173d0 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
173e0 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
173f0 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
17400 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
17410 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
17420 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
17430 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
17440 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
17450 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
17460 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
17470 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
17480 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
17490 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
174a0 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
174b0 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d  /.  for(pParent=
174c0 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72  p; pParent; pPar
174d0 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72  ent=pParent->pPr
174e0 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e  ior, pSub=pSub->
174f0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74  pPrior){.    int
17500 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 69 6e   nSubSrc;.    in
17510 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  t jointype = 0;.
17520 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53      pSubSrc = pS
17530 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  ub->pSrc;     /*
17540 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
17550 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
17560 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
17570 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d  c->nSrc;  /* Num
17580 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
17590 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  subquery FROM cl
175a0 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63  ause */.    pSrc
175b0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
175c0 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
175d0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
175e0 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20  r query */..    
175f0 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20  if( pSrc ){.    
17600 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
17610 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73  t==p );  /* Firs
17620 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74  t time through t
17630 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
17640 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62   jointype = pSub
17650 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  item->jointype;.
17660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17670 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
17680 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61  !=p );  /* 2nd a
17690 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69  nd subsequent ti
176a0 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  mes through the 
176b0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53  loop */.      pS
176c0 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
176d0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
176e0 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c  istAppend(db, 0,
176f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
17700 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( pSrc==0 ){.   
17710 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
17720 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
17730 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
17740 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
17750 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
17760 72 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65  ry uses a single
17770 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f   slot of the FRO
17780 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
17790 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65  outer.    ** que
177a0 72 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71  ry.  If the subq
177b0 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68  uery has more th
177c0 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69  an one element i
177d0 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
177e0 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65  e,.    ** then e
177f0 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  xpand the outer 
17800 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70  query to make sp
17810 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f  ace for it to ho
17820 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a  ld all elements.
17830 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75      ** of the su
17840 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20  bquery..    **. 
17850 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
17860 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
17870 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
17880 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52  bA, (SELECT * FR
17890 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20  OM sub1, sub2), 
178a0 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  tabB;.    **.   
178b0 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75   ** The outer qu
178c0 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20  ery has 3 slots 
178d0 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75  in its FROM clau
178e0 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66  se.  One slot of
178f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
17900 72 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64  r query (the mid
17910 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65  dle slot) is use
17920 64 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72  d by the subquer
17930 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20  y.  The next.   
17940 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64   ** block of cod
17950 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68  e will expand th
17960 65 20 6f 75 74 20 71 75 65 72 79 20 74 6f 20 34  e out query to 4
17970 20 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69 64   slots.  The mid
17980 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20  dle.    ** slot 
17990 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74  is expanded to t
179a0 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65  wo slots in orde
179b0 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  r to make space 
179c0 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  for the.    ** t
179d0 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
179e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
179f0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
17a00 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
17a10 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
17a20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20    pParent->pSrc 
17a30 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  = pSrc = sqlite3
17a40 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
17a50 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63  b, pSrc, nSubSrc
17a60 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20  -1,iFrom+1);.   
17a70 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
17a80 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
17a90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17aa0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
17ab0 54 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f  Transfer the FRO
17ac0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  M clause terms f
17ad0 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79  rom the subquery
17ae0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
17af0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
17b00 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
17b10 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
17b20 29 7b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  ){.      pSrc->a
17b30 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
17b40 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
17b50 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
17b60 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
17b70 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
17b80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
17b90 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e  c->a[iFrom].join
17ba0 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
17bb0 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
17bc0 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
17bd0 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
17be0 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
17bf0 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
17c00 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
17c10 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
17c20 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
17c30 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
17c40 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
17c50 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
17c60 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
17c70 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
17c80 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
17c90 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
17ca0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
17cb0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
17cc0 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
17cd0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
17ce0 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
17cf0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
17d00 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
17d10 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
17d20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
17d30 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
17d40 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
17d50 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
17d60 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
17d70 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
17d80 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
17d90 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
17da0 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
17db0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
17dc0 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
17dd0 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
17de0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72      pList = pPar
17df0 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ent->pEList;.   
17e00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
17e10 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
17e20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
17e30 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  r;.      if( pLi
17e40 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
17e50 30 20 26 26 20 28 70 45 78 70 72 20 3d 20 70 4c  0 && (pExpr = pL
17e60 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
17e70 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 29 7b 0a 20  ->span.z!=0 ){. 
17e80 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b         pList->a[
17e90 69 5d 2e 7a 4e 61 6d 65 20 3d 20 0a 20 20 20 20  i].zName = .    
17ea0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17eb0 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
17ec0 28 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 73 70  (char*)pExpr->sp
17ed0 61 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 73 70 61  an.z, pExpr->spa
17ee0 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n.n);.      }.  
17ef0 20 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70    }.    substExp
17f00 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
17f10 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65  t->pEList, iPare
17f20 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
17f30 29 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  );.    if( isAgg
17f40 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
17f50 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
17f60 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  ent->pGroupBy, i
17f70 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
17f80 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 75 62  List);.      sub
17f90 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
17fa0 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
17fb0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
17fc0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
17fd0 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
17fe0 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  y ){.      asser
17ff0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  t( pParent->pOrd
18000 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
18010 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
18020 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
18030 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
18040 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
18050 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
18060 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29  rent->pOrderBy )
18070 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70  {.      substExp
18080 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
18090 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61  t->pOrderBy, iPa
180a0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
180b0 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  st);.    }.    i
180c0 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20  f( pSub->pWhere 
180d0 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20  ){.      pWhere 
180e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
180f0 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72  (db, pSub->pWher
18100 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
18110 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b       pWhere = 0;
18120 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
18130 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
18140 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
18150 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 3d 3d  arent->pHaving==
18160 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
18170 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 50  nt->pHaving = pP
18180 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b 0a 20  arent->pWhere;. 
18190 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
181a0 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
181b0 20 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64       substExpr(d
181c0 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  b, pParent->pHav
181d0 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ing, iParent, pS
181e0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
181f0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
18200 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ing = sqlite3Exp
18210 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74  rAnd(db, pParent
18220 2d 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20  ->pHaving, .    
18230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
18250 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
18260 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 29 29   pSub->pHaving))
18270 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18280 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
18290 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  y==0 );.      pP
182a0 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20  arent->pGroupBy 
182b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
182c0 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  tDup(db, pSub->p
182d0 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 7d 65  GroupBy);.    }e
182e0 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74  lse{.      subst
182f0 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
18300 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
18310 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
18320 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
18330 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
18340 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
18350 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57  rent->pWhere, pW
18360 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  here);.    }.  .
18370 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74      /* The flatt
18380 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
18390 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
183a0 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
183b0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
183c0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
183d0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  . .    */.    pP
183e0 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20  arent->selFlags 
183f0 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  |= pSub->selFlag
18400 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b  s & SF_Distinct;
18410 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
18420 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
18430 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
18440 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
18450 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
18460 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
18470 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
18480 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
18490 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
184a0 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
184b0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
184c0 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
184d0 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
184e0 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
184f0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
18500 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
18510 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
18520 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
18530 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
18540 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
18550 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
18560 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
18570 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
18580 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
18590 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
185a0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
185b0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
185c0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
185d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
185e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
185f0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
18600 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
18610 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
18620 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53  ** Analyze the S
18630 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
18640 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
18650 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20  ument to see if 
18660 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69 6e 28 29  it.** is a min()
18670 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
18680 20 52 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   Return WHERE_OR
18690 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45  DERBY_MIN or WHE
186a0 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20 69  RE_ORDERBY_MAX i
186b0 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20 6f 72 20  f .** it is, or 
186c0 30 20 6f 74 68 65 72 77 69 73 65 2e 20 41 74 20  0 otherwise. At 
186d0 70 72 65 73 65 6e 74 2c 20 61 20 71 75 65 72 79  present, a query
186e0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74   is considered t
186f0 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f  o be.** a min()/
18700 6d 61 78 28 29 20 71 75 65 72 79 20 69 66 3a 0a  max() query if:.
18710 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65 72 65  **.**   1. There
18720 20 69 73 20 61 20 73 69 6e 67 6c 65 20 6f 62 6a   is a single obj
18730 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ect in the FROM 
18740 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
18750 32 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69  2. There is a si
18760 6e 67 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ngle expression 
18770 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
18780 74 2c 20 61 6e 64 20 69 74 20 69 73 0a 2a 2a 20  t, and it is.** 
18790 20 20 20 20 20 65 69 74 68 65 72 20 6d 69 6e 28       either min(
187a0 78 29 20 6f 72 20 6d 61 78 28 78 29 2c 20 77 68  x) or max(x), wh
187b0 65 72 65 20 78 20 69 73 20 61 20 63 6f 6c 75 6d  ere x is a colum
187c0 6e 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a  n reference..*/.
187d0 73 74 61 74 69 63 20 69 6e 74 20 6d 69 6e 4d 61  static int minMa
187e0 78 51 75 65 72 79 28 50 61 72 73 65 20 2a 70 50  xQuery(Parse *pP
187f0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
18800 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
18810 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
18820 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
18830 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ..  if( pEList->
18840 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
18850 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
18860 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78 70 72 20  NORMAL;.  pExpr 
18870 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  = pEList->a[0].p
18880 45 78 70 72 3b 0a 20 20 70 45 4c 69 73 74 20 3d  Expr;.  pEList =
18890 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
188a0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
188b0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
188c0 7c 7c 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20  || pEList==0 || 
188d0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
188e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
188f0 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  f( pEList->a[0].
18900 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
18910 47 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72  G_COLUMN ) retur
18920 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
18930 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28 20 70 45  NORMAL;.  if( pE
18940 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 33 20  xpr->token.n!=3 
18950 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f  ) return WHERE_O
18960 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
18970 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
18980 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78 70  ICmp((char*)pExp
18990 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69 6e 22  r->token.z,"min"
189a0 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ,3)==0 ){.    re
189b0 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  turn WHERE_ORDER
189c0 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73 65 20  BY_MIN;.  }else 
189d0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
189e0 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78 70 72  Cmp((char*)pExpr
189f0 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78 22 2c  ->token.z,"max",
18a00 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  3)==0 ){.    ret
18a10 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
18a20 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72 65 74  Y_MAX;.  }.  ret
18a30 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
18a40 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f 2a 0a  Y_NORMAL;.}../*.
18a50 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65  ** If the source
18a60 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65  -list item passe
18a70 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
18a80 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77   was augmented w
18a90 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45  ith an.** INDEXE
18aa0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
18ab0 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20  n try to locate 
18ac0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  the specified in
18ad0 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a  dex. If there.**
18ae0 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75   was such a clau
18af0 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64  se and the named
18b00 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65   index cannot be
18b10 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a   found, return .
18b20 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  ** SQLITE_ERROR 
18b30 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
18b40 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74  or in pParse. Ot
18b50 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74  herwise, populat
18b60 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e  e .** pFrom->pIn
18b70 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53  dex and return S
18b80 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
18b90 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
18ba0 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70  yLookup(Parse *p
18bb0 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
18bc0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
18bd0 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
18be0 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e  >pTab && pFrom->
18bf0 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61  zIndex ){.    Ta
18c00 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
18c10 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61  m->pTab;.    cha
18c20 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f  r *zIndex = pFro
18c30 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49  m->zIndex;.    I
18c40 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
18c50 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
18c60 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20  Index; .        
18c70 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53  pIdx && sqlite3S
18c80 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61  trICmp(pIdx->zNa
18c90 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20  me, zIndex); .  
18ca0 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d        pIdx=pIdx-
18cb0 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20  >pNext.    );.  
18cc0 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20    if( !pIdx ){. 
18cd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
18ce0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
18cf0 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22   such index: %s"
18d00 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20  , zIndex, 0);.  
18d10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18d20 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
18d30 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78     pFrom->pIndex
18d40 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72   = pIdx;.  }.  r
18d50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
18d70 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b  outine is a Walk
18d80 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  er callback for 
18d90 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45  "expanding" a SE
18da0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
18db0 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d  ** "Expanding" m
18dc0 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66  eans to do the f
18dd0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
18de0 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
18df0 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
18e00 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
18e10 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
18e20 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
18e30 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
18e40 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
18e50 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
18e60 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
18e70 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
18e80 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
18e90 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
18ea0 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
18eb0 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
18ec0 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
18ed0 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
18ee0 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
18ef0 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
18f00 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
18f10 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
18f20 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
18f30 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
18f40 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
18f50 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
18f60 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
18f70 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
18f80 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
18f90 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
18fa0 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
18fb0 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
18fc0 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
18fd0 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
18fe0 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74  g up the presist
18ff0 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
19000 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
19010 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
19020 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
19030 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
19040 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f  clause to accomo
19050 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
19060 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
19070 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
19080 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
19090 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
190a0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
190b0 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
190c0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
190d0 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
190e0 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
190f0 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
19100 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
19110 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
19120 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
19130 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
19140 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
19150 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
19160 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
19170 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
19180 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
19190 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
191a0 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
191b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
191c0 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61  electExpander(Wa
191d0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
191e0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
191f0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61  se *pParse = pWa
19200 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
19210 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53  int i, j, k;.  S
19220 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
19230 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
19240 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
19250 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
19260 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  om;.  sqlite3 *d
19270 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
19280 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
19290 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20  cFailed  ){.    
192a0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
192b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
192c0 53 72 63 3d 3d 30 20 7c 7c 20 28 70 2d 3e 73 65  Src==0 || (p->se
192d0 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
192e0 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
192f0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
19300 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c  ;.  }.  p->selFl
19310 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
19320 65 64 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  ed;.  pTabList =
19330 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
19340 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
19350 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
19360 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
19370 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
19380 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
19390 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
193a0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
193b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
193c0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
193d0 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
193e0 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61  sors(pParse, pTa
193f0 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  bList);..  /* Lo
19400 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
19410 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
19420 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
19430 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
19440 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
19450 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
19460 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
19470 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
19480 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
19490 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
194a0 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
194b0 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
194c0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
194d0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
194e0 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
194f0 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
19500 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
19510 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
19520 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72  Tab;.    if( pFr
19530 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  om->pTab!=0 ){. 
19540 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61       /* This sta
19550 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61  tement has alrea
19560 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64  dy been prepared
19570 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  .  There is no n
19580 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  eed.      ** to 
19590 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  go further. */. 
195a0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
195b0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
195c0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
195d0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d   }.    if( pFrom
195e0 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69  ->zName==0 ){.#i
195f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19600 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T_SUBQUERY.     
19610 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
19620 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
19630 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
19640 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
19650 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
19660 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ECT */.      ass
19670 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a  ert( pSel!=0 );.
19680 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
19690 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
196a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
196b0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
196c0 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70 46   pSel);.      pF
196d0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
196e0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
196f0 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
19700 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20  f(Table));.     
19710 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
19720 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
19730 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 64 62 20  .      pTab->db 
19740 3d 20 64 62 3b 0a 20 20 20 20 20 20 70 54 61 62  = db;.      pTab
19750 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
19760 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
19770 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
19780 62 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75  b, "sqlite_subqu
19790 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a  ery_%p_", (void*
197a0 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68  )pTab);.      wh
197b0 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
197c0 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c  r ){ pSel = pSel
197d0 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20  ->pPrior; }.    
197e0 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
197f0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
19800 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  se, pSel->pEList
19810 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
19820 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
19830 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
19840 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   -1;.      pTab-
19850 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
19860 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69  Ephemeral;.#endi
19870 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
19880 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
19890 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
198a0 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
198b0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
198c0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
198d0 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
198e0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
198f0 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73  Tab = .        s
19900 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
19910 65 28 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d  e(pParse,0,pFrom
19920 2d 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a  ->zName,pFrom->z
19930 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20  Database);.     
19940 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
19950 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
19960 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65  .      pTab->nRe
19970 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  f++;.#if !define
19980 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
19990 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20  EW) || !defined 
199a0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
199b0 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20  TUALTABLE).     
199c0 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
199d0 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28  ct || IsVirtual(
199e0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
199f0 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72   /* We reach her
19a00 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74  e if the named t
19a10 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79  able is a really
19a20 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20   a view */.     
19a30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69     if( sqlite3Vi
19a40 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
19a50 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
19a60 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
19a70 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  t;..        /* I
19a80 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  f pFrom->pSelect
19a90 21 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65 20  !=0 it means we 
19aa0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
19ab0 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 69   a.        ** vi
19ac0 65 77 20 77 69 74 68 69 6e 20 61 20 76 69 65 77  ew within a view
19ad0 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  .  The SELECT st
19ae0 72 75 63 74 75 72 65 20 68 61 73 20 61 6c 72 65  ructure has alre
19af0 61 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20 20  ady been.       
19b00 20 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74 68   ** copied by th
19b10 65 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f 20  e outer view so 
19b20 77 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65 20  we can skip the 
19b30 63 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a 20  copy step here. 
19b40 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
19b50 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20 20   inner view..   
19b60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
19b70 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  if( pFrom->pSele
19b80 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ct==0 ){.       
19b90 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
19ba0 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
19bb0 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70  tDup(db, pTab->p
19bc0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
19bd0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
19be0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46  lect(pWalker, pF
19bf0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
19c00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
19c10 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
19c20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65     /* Locate the
19c30 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20   index named by 
19c40 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
19c50 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a  lause, if any. *
19c60 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
19c70 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
19c80 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
19c90 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19ca0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
19cb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
19cc0 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
19cd0 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
19ce0 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
19cf0 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
19d00 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
19d10 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f  led || sqlitePro
19d20 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
19d30 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
19d40 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
19d50 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
19d60 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
19d70 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
19d80 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
19d90 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
19da0 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
19db0 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
19dc0 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
19dd0 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
19de0 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
19df0 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
19e00 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
19e10 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
19e20 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
19e30 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70  th the TK_ALL op
19e40 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
19e50 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
19e60 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
19e70 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66  list..  ** The f
19e80 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
19e90 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
19ea0 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72   the TK_ALL expr
19eb0 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
19ec0 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65  nd.  ** each one
19ed0 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
19ee0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
19ef0 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
19f00 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
19f10 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
19f20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
19f30 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
19f40 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
19f50 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
19f60 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
19f70 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
19f80 20 6b 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   k++){.    Expr 
19f90 2a 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  *pE = pEList->a[
19fa0 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
19fb0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ( pE->op==TK_ALL
19fc0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
19fd0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
19fe0 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 20 26   && pE->pRight &
19ff0 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
1a000 3d 3d 54 4b 5f 41 4c 4c 0a 20 20 20 20 20 20 20  ==TK_ALL.       
1a010 20 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 26    && pE->pLeft &
1a020 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
1a030 3d 54 4b 5f 49 44 20 29 20 62 72 65 61 6b 3b 0a  =TK_ID ) break;.
1a040 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69    }.  if( k<pELi
1a050 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
1a060 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65   /*.    ** If we
1a070 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61   get here it mea
1a080 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ns the result se
1a090 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  t contains one o
1a0a0 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a  r more "*".    *
1a0b0 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  * operators that
1a0c0 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
1a0d0 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f  nded.  Loop thro
1a0e0 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
1a0f0 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ion.    ** in th
1a100 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
1a110 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65   expand them one
1a120 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a   by one..    */.
1a130 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
1a140 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45  ist_item *a = pE
1a150 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70  List->a;.    Exp
1a160 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b  rList *pNew = 0;
1a170 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
1a180 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
1a190 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67  gs;.    int long
1a1a0 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26  Names = (flags &
1a1b0 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
1a1c0 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20  ames)!=0.       
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1a1e0 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  & (flags & SQLIT
1a1f0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
1a200 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d  ==0;..    for(k=
1a210 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
1a220 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
1a230 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e  Expr *pE = a[k].
1a240 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
1a250 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20   pE->op!=TK_ALL 
1a260 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70  &&.           (p
1a270 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
1a280 20 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c   pE->pRight==0 |
1a290 7c 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  | pE->pRight->op
1a2a0 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20  !=TK_ALL) ){.   
1a2b0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
1a2c0 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
1a2d0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
1a2e0 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
1a2f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1a300 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1a310 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1a320 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61  (pParse, pNew, a
1a330 5b 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  [k].pExpr, 0);. 
1a340 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
1a350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
1a360 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
1a370 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d  -1].zName = a[k]
1a380 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
1a390 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
1a3a0 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
1a3b0 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
1a3c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a3d0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
1a3e0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
1a3f0 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
1a400 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
1a410 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
1a420 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
1a430 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
1a440 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
1a450 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
1a460 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
1a470 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
1a480 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1a490 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
1a4a0 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
1a4b0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
1a4c0 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  DOT && pE->pLeft
1a4d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
1a4e0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1a4f0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1a500 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  &pE->pLeft->toke
1a510 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
1a520 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  e{.          zTN
1a530 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
1a540 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
1a550 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
1a560 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
1a570 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
1a580 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
1a590 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1a5a0 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
1a5b0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
1a5c0 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
1a5d0 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
1a5e0 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
1a5f0 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d   || zTabName[0]=
1a600 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  =0 ){ .         
1a610 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
1a620 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
1a630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a640 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1a650 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
1a660 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
1a670 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74  ame && sqlite3St
1a680 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54  rICmp(zTName, zT
1a690 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  abName)!=0 ){.  
1a6a0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1a6b0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
1a6c0 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
1a6d0 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
1a6e0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
1a6f0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
1a700 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
1a710 20 2a 70 45 78 70 72 2c 20 2a 70 52 69 67 68 74   *pExpr, *pRight
1a720 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
1a730 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62  ar *zName = pTab
1a740 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
1a750 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ..            /*
1a760 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20   If a column is 
1a770 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65  marked as 'hidde
1a780 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e  n' (currently on
1a790 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  ly possible.    
1a7a0 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76          ** for v
1a7b0 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20  irtual tables), 
1a7c0 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69  do not include i
1a7d0 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65  t in the expande
1a7e0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
1a7f0 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
1a800 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
1a810 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1a820 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28   IsHiddenColumn(
1a830 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20  &pTab->aCol[j]) 
1a840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1a850 20 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61   assert(IsVirtua
1a860 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20  l(pTab));.      
1a870 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1a880 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1a890 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1a8a0 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i>0 ){.        
1a8b0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
1a8c0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74  List_item *pLeft
1a8d0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1a8e0 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  i-1];.          
1a8f0 20 20 20 20 69 66 28 20 28 70 4c 65 66 74 5b 31      if( (pLeft[1
1a900 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
1a910 4e 41 54 55 52 41 4c 29 21 3d 30 20 26 26 0a 20  NATURAL)!=0 &&. 
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a930 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 49 6e 64         columnInd
1a940 65 78 28 70 4c 65 66 74 2d 3e 70 54 61 62 2c 20  ex(pLeft->pTab, 
1a950 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
1a960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a970 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69  In a NATURAL joi
1a980 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e  n, omit the join
1a990 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
1a9a0 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
1a9b0 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 6e 20 74     ** table on t
1a9c0 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1a9e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1a9f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1aa00 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1aa10 64 4c 69 73 74 49 6e 64 65 78 28 70 4c 65 66 74  dListIndex(pLeft
1aa20 5b 31 5d 2e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  [1].pUsing, zNam
1aa30 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
1aa40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
1aa50 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
1aa60 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
1aa70 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1aa90 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
1aaa0 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
1aab0 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1aad0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1aae0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1aaf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ab00 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
1ab10 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
1ab20 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29   TK_ID, 0, 0, 0)
1ab30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1ab40 28 20 70 52 69 67 68 74 3d 3d 30 20 29 20 62 72  ( pRight==0 ) br
1ab50 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1ab60 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28   setQuotedToken(
1ab70 70 50 61 72 73 65 2c 20 26 70 52 69 67 68 74 2d  pParse, &pRight-
1ab80 3e 74 6f 6b 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a  >token, zName);.
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1aba0 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61  longNames || pTa
1abb0 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
1abc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
1abd0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c  xpr *pLeft = sql
1abe0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
1abf0 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 30  , TK_ID, 0, 0, 0
1ac00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1ac10 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
1ac20 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
1ac30 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
1ac40 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
1ac50 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
1ac60 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
1ac70 20 20 20 20 20 20 20 20 20 20 20 73 65 74 51 75             setQu
1ac80 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61 72 73 65  otedToken(pParse
1ac90 2c 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c  , &pLeft->token,
1aca0 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20   zTabName);.    
1acb0 20 20 20 20 20 20 20 20 20 20 73 65 74 54 6f 6b            setTok
1acc0 65 6e 28 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c  en(&pExpr->span,
1acd0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1ace0 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
1acf0 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
1ad00 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  zTabName, zName)
1ad10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1ad20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e   pExpr->span.dyn
1ad30 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1ad40 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
1ad50 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .z = 0;.        
1ad60 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
1ad70 65 6e 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  en.n = 0;.      
1ad80 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
1ad90 6f 6b 65 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20  oken.dyn = 0;.  
1ada0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1adb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1adc0 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1ade0 70 72 2d 3e 73 70 61 6e 20 3d 20 70 45 78 70 72  pr->span = pExpr
1adf0 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
1ae00 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70         pExpr->sp
1ae10 61 6e 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20  an.dyn = 0;.    
1ae20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ae30 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
1ae40 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mes ){.         
1ae50 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
1ae60 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1ae70 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
1ae80 70 45 78 70 72 2c 20 26 70 45 78 70 72 2d 3e 73  pExpr, &pExpr->s
1ae90 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pan);.          
1aea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1aeb0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
1aec0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
1aed0 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
1aee0 2c 20 70 45 78 70 72 2c 20 26 70 52 69 67 68 74  , pExpr, &pRight
1aef0 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
1af00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1af10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1af20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65        if( !table
1af30 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Seen ){.        
1af40 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a    if( zTName ){.
1af50 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1af60 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1af70 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
1af80 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29  le: %s", zTName)
1af90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1afa0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
1afb0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1afc0 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65  Parse, "no table
1afd0 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  s specified");. 
1afe0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1aff0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1b000 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1b010 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  TName);.      }.
1b020 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1b030 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1b040 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  db, pEList);.   
1b050 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
1b060 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  w;.  }.#if SQLIT
1b070 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69  E_MAX_COLUMN.  i
1b080 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  f( p->pEList && 
1b090 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
1b0a0 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
1b0b0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
1b0c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1b0d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b0e0 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
1b0f0 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
1b100 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1b110 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1b120 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
1b130 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
1b140 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
1b150 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  alker..**.** Whe
1b160 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1b170 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78  s the Walker.xEx
1b180 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
1b190 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
1b1a0 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77  .** are walked w
1b1b0 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f  ithout any actio
1b1c0 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61  ns being taken a
1b1d0 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72  t each node.  Pr
1b1e0 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65  esumably,.** whe
1b1f0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1b200 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65  s used for Walke
1b210 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
1b220 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e  then .** Walker.
1b230 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1b240 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d  is set to do som
1b250 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f  ething useful fo
1b260 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71  r every .** subq
1b270 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
1b280 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  er tree..*/.stat
1b290 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e  ic int exprWalkN
1b2a0 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  oop(Walker *pWal
1b2b0 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
1b2c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  ){.  return WRC_
1b2d0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
1b2e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1b2f0 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45  "expands" a SELE
1b300 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
1b310 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71   all of its subq
1b320 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61  ueries..** For a
1b330 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
1b340 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74  ation on what it
1b350 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e   means to "expan
1b360 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  d" a SELECT.** s
1b370 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68  tatement, see th
1b380 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
1b390 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f   selectExpand wo
1b3a0 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62  rker callback ab
1b3b0 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e  ove..**.** Expan
1b3c0 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74  ding a SELECT st
1b3d0 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66  atement is the f
1b3e0 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f  irst step in pro
1b3f0 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c  cessing a.** SEL
1b400 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
1b410 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
1b420 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70  ment must be exp
1b430 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  anded before.** 
1b440 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
1b450 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a  is performed..**
1b460 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20  .** If anything 
1b470 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65  goes wrong, an e
1b480 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
1b490 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61  written into pPa
1b4a0 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  rse..** The call
1b4b0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  ing function can
1b4c0 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62   detect the prob
1b4d0 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  lem by looking a
1b4e0 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a  t pParse->nErr.*
1b4f0 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d  * and/or pParse-
1b500 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1b510 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
1b520 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  d sqlite3SelectE
1b530 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61  xpand(Parse *pPa
1b540 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
1b550 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  lect){.  Walker 
1b560 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  w;.  w.xSelectCa
1b570 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45  llback = selectE
1b580 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 45 78  xpander;.  w.xEx
1b590 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
1b5a0 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
1b5b0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
1b5c0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
1b5d0 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
1b5e0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
1b5f0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1b600 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  RY./*.** This is
1b610 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63   a Walker.xSelec
1b620 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61  tCallback callba
1b630 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ck for the sqlit
1b640 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f  e3SelectTypeInfo
1b650 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
1b660 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
1b670 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
1b680 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e  uery, add Column
1b690 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d  .zType and Colum
1b6a0 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  n.zColl.** infor
1b6b0 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61  mation to the Ta
1b6c0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
1b6d0 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
1b6e0 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20  e result set.** 
1b6f0 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79  of that subquery
1b700 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  ..**.** The Tabl
1b710 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
1b720 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
1b730 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63  result set was c
1b740 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79  onstructed.** by
1b750 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
1b760 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61  ) but the type a
1b770 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
1b780 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69  ormation was omi
1b790 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20  tted.** at that 
1b7a0 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64  point because id
1b7b0 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f  entifiers had no
1b7c0 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c  t yet been resol
1b7d0 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ved.  This.** ro
1b7e0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1b7f0 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72  after identifier
1b800 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
1b810 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
1b820 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65  tAddSubqueryType
1b830 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61  Info(Walker *pWa
1b840 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
1b850 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
1b860 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72  e;.  int i;.  Sr
1b870 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
1b880 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1b890 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a  t_item *pFrom;..
1b8a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c    assert( p->sel
1b8b0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
1b8c0 76 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70 2d  ved );.  if( (p-
1b8d0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
1b8e0 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29  asTypeInfo)==0 )
1b8f0 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  {.    p->selFlag
1b900 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
1b910 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65 20  nfo;.    pParse 
1b920 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
1b930 65 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  e;.    pTabList 
1b940 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66  = p->pSrc;.    f
1b950 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
1b960 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
1b970 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
1b980 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
1b990 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1b9a0 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
1b9b0 20 20 20 69 66 28 20 70 54 61 62 20 26 26 20 28     if( pTab && (
1b9c0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
1b9d0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
1b9e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1b9f0 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
1ba00 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1ba10 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
1ba20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
1ba30 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
1ba40 65 63 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ect;.        ass
1ba50 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20 20 20  ert( pSel );.   
1ba60 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
1ba70 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20  ->pPrior ) pSel 
1ba80 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a  = pSel->pPrior;.
1ba90 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 41 64          selectAd
1baa0 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
1bab0 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
1bac0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62  pTab->nCol, pTab
1bad0 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 29 3b 0a 20  ->aCol, pSel);. 
1bae0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1baf0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
1bb00 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69 66  ntinue;.}.#endif
1bb10 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
1bb20 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74  utine adds datat
1bb30 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ype and collatin
1bb40 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72  g sequence infor
1bb50 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65  mation to.** the
1bb60 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
1bb70 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  s of all FROM-cl
1bb80 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20  ause subqueries 
1bb90 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  in a.** SELECT s
1bba0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
1bbb0 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  Use this routine
1bbc0 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f   after name reso
1bbd0 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
1bbe0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
1bbf0 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
1bc00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1bc10 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
1bc20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bc30 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1bc40 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53  Walker w;.  w.xS
1bc50 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
1bc60 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
1bc70 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78  yTypeInfo;.  w.x
1bc80 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
1bc90 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
1bca0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
1bcb0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
1bcc0 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
1bcd0 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  t);.#endif.}.../
1bce0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1bcf0 65 20 73 65 74 73 20 6f 66 20 61 20 53 45 4c 45  e sets of a SELE
1bd00 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  CT statement for
1bd10 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68   processing.  Th
1bd20 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  e.** following i
1bd30 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a  s accomplished:.
1bd40 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42  **.**     *  VDB
1bd50 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E Cursor numbers
1bd60 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f   are assigned to
1bd70 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
1bd80 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a   terms..**     *
1bd90 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c    Ephemeral Tabl
1bda0 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72  e objects are cr
1bdb0 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52  eated for all FR
1bdc0 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
1bdd0 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  ries..**     *  
1bde0 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1bdf0 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64  uses are shifted
1be00 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74   into WHERE stat
1be10 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20  ements.**     * 
1be20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61   Wildcards "*" a
1be30 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20  nd "TABLE.*" in 
1be40 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20  result sets are 
1be50 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20  expanded..**    
1be60 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20   *  Identifiers 
1be70 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72  in expression ar
1be80 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62  e matched to tab
1be90 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  les..**.** This 
1bea0 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63  routine acts rec
1beb0 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20  ursively on all 
1bec0 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69  subqueries withi
1bed0 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  n the SELECT..*/
1bee0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
1bef0 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65  ectPrep(.  Parse
1bf00 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1bf10 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
1bf20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1bf30 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1bf40 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
1bf50 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
1bf60 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61  g coded. */.  Na
1bf70 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
1bf80 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  rNC  /* Name con
1bf90 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e  text for contain
1bfa0 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  er */.){.  sqlit
1bfb0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 70 3d  e3 *db;.  if( p=
1bfc0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  =0 ) return;.  d
1bfd0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1bfe0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
1bff0 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
1c000 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  fo ) return;.  i
1c010 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1c020 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1c030 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
1c040 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
1c050 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  and(pParse, p);.
1c060 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1c070 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
1c080 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
1c090 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
1c0a0 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61  eSelectNames(pPa
1c0b0 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43  rse, p, pOuterNC
1c0c0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
1c0d0 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
1c0e0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1c0f0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
1c100 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70  ectAddTypeInfo(p
1c110 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  Parse, p);.}../*
1c120 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67  .** Reset the ag
1c130 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
1c140 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  tor..**.** The a
1c150 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
1c160 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66  ator is a set of
1c170 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68   memory cells th
1c180 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72  at hold.** inter
1c190 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20  mediate results 
1c1a0 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e  while calculatin
1c1b0 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  g an aggregate. 
1c1c0 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
1c1d0 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e   simply stores N
1c1e0 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74  ULLs in all of t
1c1f0 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  hose memory cell
1c200 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1c210 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74  d resetAccumulat
1c220 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
1c230 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
1c240 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
1c250 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1c260 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1c270 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
1c280 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20 70 41  *pFunc;.  if( pA
1c290 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41  ggInfo->nFunc+pA
1c2a0 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ggInfo->nColumn=
1c2b0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1c2c0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1c2d0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
1c2e0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
1c2f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c300 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1c310 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
1c320 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  i].iMem);.  }.  
1c330 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e  for(pFunc=pAggIn
1c340 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20  fo->aFunc, i=0; 
1c350 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
1c360 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29  c; i++, pFunc++)
1c370 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1c380 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1c390 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d  ll, 0, pFunc->iM
1c3a0 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75  em);.    if( pFu
1c3b0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  nc->iDistinct>=0
1c3c0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
1c3d0 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70  pE = pFunc->pExp
1c3e0 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  r;.      if( pE-
1c3f0 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  >pList==0 || pE-
1c400 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  >pList->nExpr!=1
1c410 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1c420 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1c430 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e  se, "DISTINCT in
1c440 20 61 67 67 72 65 67 61 74 65 20 6d 75 73 74 20   aggregate must 
1c450 62 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20  be followed ".  
1c460 20 20 20 20 20 20 20 20 20 22 62 79 20 61 6e 20           "by an 
1c470 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
1c480 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69        pFunc->iDi
1c490 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20  stinct = -1;.   
1c4a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c4b0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1c4c0 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
1c4d0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
1c4e0 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  , pE->pList);.  
1c4f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c500 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
1c510 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75  enEphemeral, pFu
1c520 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30  nc->iDistinct, 0
1c530 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1c550 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
1c560 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
1c570 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FF);.      }.   
1c580 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1c590 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
1c5a0 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
1c5b0 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
1c5c0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
1c5d0 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
1c5e0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
1c5f0 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
1c600 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
1c610 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
1c620 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
1c630 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1c640 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1c650 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
1c660 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
1c670 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
1c680 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
1c690 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
1c6a0 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
1c6b0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
1c6c0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
1c6d0 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74  pList;.    sqlit
1c6e0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1c6f0 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
1c700 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
1c710 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
1c720 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1c730 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
1c740 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
1c750 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a  UNCDEF);.  }.}..
1c760 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1c770 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d   accumulator mem
1c780 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e  ory cells for an
1c790 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64   aggregate based
1c7a0 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65   on.** the curre
1c7b0 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
1c7c0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1c7d0 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c  id updateAccumul
1c7e0 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
1c7f0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
1c800 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
1c810 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1c820 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1c830 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
1c840 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20  c *pF;.  struct 
1c850 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b  AggInfo_col *pC;
1c860 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69  ..  pAggInfo->di
1c870 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
1c880 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
1c890 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
1c8a0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
1c8b0 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
1c8c0 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e  int nArg;.    in
1c8d0 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a  t addrNext = 0;.
1c8e0 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a      int regAgg;.
1c8f0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
1c900 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
1c910 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  >pList;.    if( 
1c920 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
1c930 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Arg = pList->nEx
1c940 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67  pr;.      regAgg
1c950 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1c960 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
1c970 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Arg);.      sqli
1c980 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
1c990 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
1c9a0 74 2c 20 72 65 67 41 67 67 2c 20 30 29 3b 0a 20  t, regAgg, 0);. 
1c9b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c9c0 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nArg = 0;.      
1c9d0 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  regAgg = 0;.    
1c9e0 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44  }.    if( pF->iD
1c9f0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
1ca00 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73      addrNext = s
1ca10 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1ca20 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73  bel(v);.      as
1ca30 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
1ca40 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69  .      codeDisti
1ca50 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e  nct(pParse, pF->
1ca60 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e  iDistinct, addrN
1ca70 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b  ext, 1, regAgg);
1ca80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1ca90 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67 73 20  F->pFunc->flags 
1caa0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
1cab0 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
1cac0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
1cad0 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
1cae0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1caf0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
1cb00 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
1cb10 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
1cb20 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
1cb30 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44  ->pFunc has NEED
1cb40 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f  COLL */.      fo
1cb50 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
1cb60 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
1cb70 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
1cb80 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
1cb90 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
1cba0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
1cbb0 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
1cbc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cbd0 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
1cbe0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
1cbf0 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
1cc00 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
1cc10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cc20 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
1cc30 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68  eq, 0, 0, 0, (ch
1cc40 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
1cc50 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
1cc60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cc70 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74  dOp4(v, OP_AggSt
1cc80 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70  ep, 0, regAgg, p
1cc90 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20  F->iMem,.       
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1ccb0 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c  void*)pF->pFunc,
1ccc0 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
1ccd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1cce0 6e 67 65 50 35 28 76 2c 20 6e 41 72 67 29 3b 0a  ngeP5(v, nArg);.
1ccf0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
1cd00 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
1cd10 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
1cd20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1cd30 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
1cd40 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
1cd50 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
1cd60 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
1cd70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1cd80 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1cd90 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
1cda0 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30   }.  }.  for(i=0
1cdb0 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
1cdc0 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
1cdd0 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
1cde0 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
1cdf0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1ce00 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
1ce10 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d  , pC->iMem);.  }
1ce20 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
1ce30 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d 0a 0a  ectMode = 0;.}..
1ce40 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1ce50 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45  ode for the SELE
1ce60 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76  CT statement giv
1ce70 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75  en in the p argu
1ce80 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ment.  .**.** Th
1ce90 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
1cea0 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72  stributed in var
1ceb0 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64  ious ways depend
1cec0 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f  ing on the.** co
1ced0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65  ntents of the Se
1cee0 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
1cef0 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
1cf00 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a   argument pDest.
1cf10 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ** as follows:.*
1cf20 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e  *.**     pDest->
1cf30 65 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a  eDest    Result.
1cf40 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  **     ---------
1cf50 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
1cf60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cf70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cf80 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4f 75  --.**     SRT_Ou
1cf90 74 70 75 74 20 20 20 20 20 20 47 65 6e 65 72 61  tput      Genera
1cfa0 74 65 20 61 20 72 6f 77 20 6f 66 20 6f 75 74 70  te a row of outp
1cfb0 75 74 20 28 75 73 69 6e 67 20 74 68 65 20 4f 50  ut (using the OP
1cfc0 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20 20 20  _ResultRow.**   
1cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfe0 20 20 6f 70 63 6f 64 65 29 20 66 6f 72 20 65 61    opcode) for ea
1cff0 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 72 65  ch row in the re
1d000 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  sult set..**.** 
1d010 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20      SRT_Mem     
1d020 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69      Only valid i
1d030 66 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  f the result is 
1d040 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e  a single column.
1d050 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d060 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68          Store th
1d070 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  e first column o
1d080 66 20 74 68 65 20 66 69 72 73 74 20 72 65 73 75  f the first resu
1d090 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  lt row.**       
1d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1d0b0 20 72 65 67 69 73 74 65 72 20 70 44 65 73 74 2d   register pDest-
1d0c0 3e 69 50 61 72 6d 20 74 68 65 6e 20 61 62 61 6e  >iParm then aban
1d0d0 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a 2a 20  don the rest.** 
1d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0f0 20 20 20 20 6f 66 20 74 68 65 20 71 75 65 72 79      of the query
1d100 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e 61 74  .  This destinat
1d110 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c 49 4d  ion implies "LIM
1d120 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  IT 1"..**.**    
1d130 20 53 52 54 5f 53 65 74 20 20 20 20 20 20 20 20   SRT_Set        
1d140 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75 73 74   The result must
1d150 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   be a single col
1d160 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61 63 68  umn.  Store each
1d170 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d180 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66 20 72          row of r
1d190 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b 65 79  esult as the key
1d1a0 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73 74 2d   in table pDest-
1d1b0 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20  >iParm. .**     
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1d0 41 70 70 6c 79 20 74 68 65 20 61 66 66 69 6e 69  Apply the affini
1d1e0 74 79 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69  ty pDest->affini
1d1f0 74 79 20 62 65 66 6f 72 65 20 73 74 6f 72 69 6e  ty before storin
1d200 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  g.**            
1d210 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 73           results
1d220 2e 20 20 55 73 65 64 20 74 6f 20 69 6d 70 6c 65  .  Used to imple
1d230 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c 45 43 54  ment "IN (SELECT
1d240 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20   ...)"..**.**   
1d250 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20 20 20    SRT_Union     
1d260 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20    Store results 
1d270 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20 74 65  as a key in a te
1d280 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
1d290 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
1d2a0 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65 70 74  *     SRT_Except
1d2b0 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72 65 73        Remove res
1d2c0 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20 74 65  ults from the te
1d2d0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
1d2e0 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
1d2f0 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c 65 20  *     SRT_Table 
1d300 20 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75        Store resu
1d310 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  lts in temporary
1d320 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
1d330 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  arm..**         
1d340 20 20 20 20 20 20 20 20 20 20 20 20 54 68 69 73              This
1d350 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 45 70 68   is like SRT_Eph
1d360 65 6d 54 61 62 20 65 78 63 65 70 74 20 74 68 61  emTab except tha
1d370 74 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20  t the table.**  
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d390 20 20 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f     is assumed to
1d3a0 20 61 6c 72 65 61 64 79 20 62 65 20 6f 70 65 6e   already be open
1d3b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1d3c0 45 70 68 65 6d 54 61 62 20 20 20 20 43 72 65 61  EphemTab    Crea
1d3d0 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20  te an temporary 
1d3e0 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61  table pDest->iPa
1d3f0 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a 20  rm and store.** 
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d410 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 20 74      the result t
1d420 68 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f 72  here. The cursor
1d430 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61 66   is left open af
1d440 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ter.**          
1d450 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1d460 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20 6c  ning.  This is l
1d470 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20 65 78  ike SRT_Table ex
1d480 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20 20 20  cept that.**    
1d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4a0 20 74 68 69 73 20 64 65 73 74 69 6e 61 74 69 6f   this destinatio
1d4b0 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e 45 70  n uses OP_OpenEp
1d4c0 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65 61 74  hemeral to creat
1d4d0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1d4e0 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
1d4f0 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a 20  le first..**.** 
1d500 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e      SRT_Coroutin
1d510 65 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 63  e   Generate a c
1d520 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72  o-routine that r
1d530 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72 6f 77  eturns a new row
1d540 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
1d550 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
1d560 74 73 20 65 61 63 68 20 74 69 6d 65 20 69 74 20  ts each time it 
1d570 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68 65  is invoked.  The
1d580 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a 2a 20   entry point.** 
1d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5a0 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f      of the co-ro
1d5b0 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65 64 20  utine is stored 
1d5c0 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73  in register pDes
1d5d0 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  t->iParm..**.** 
1d5e0 20 20 20 20 53 52 54 5f 45 78 69 73 74 73 20 20      SRT_Exists  
1d5f0 20 20 20 20 53 74 6f 72 65 20 61 20 31 20 69 6e      Store a 1 in
1d600 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65   memory cell pDe
1d610 73 74 2d 3e 69 50 61 72 6d 20 69 66 20 74 68 65  st->iParm if the
1d620 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20   result.**      
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1d640 65 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e  et is not empty.
1d650 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44  .**.**     SRT_D
1d660 69 73 63 61 72 64 20 20 20 20 20 54 68 72 6f 77  iscard     Throw
1d670 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 77 61   the results awa
1d680 79 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  y.  This is used
1d690 20 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20   by SELECT.**   
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6b0 20 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74    statements wit
1d6c0 68 69 6e 20 74 72 69 67 67 65 72 73 20 77 68 6f  hin triggers who
1d6d0 73 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20  se only purpose 
1d6e0 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  is.**           
1d6f0 20 20 20 20 20 20 20 20 20 20 74 68 65 20 73 69            the si
1d700 64 65 2d 65 66 66 65 63 74 73 20 6f 66 20 66 75  de-effects of fu
1d710 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  nctions..**.** T
1d720 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1d730 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
1d740 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
1d750 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
1d760 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
1d770 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
1d780 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1d790 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
1d7a0 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
1d7b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d7c0 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
1d7d0 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
1d7e0 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
1d7f0 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
1d800 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
1d810 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74   do that..*/.int
1d820 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
1d830 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1d840 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d850 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
1d860 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1d870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d880 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1d890 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
1d8a0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
1d8b0 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57  *pDest      /* W
1d8c0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
1d8d0 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  he query results
1d8e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
1d8f0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
1d900 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
1d910 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
1d920 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
1d930 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69  Return from sqli
1d940 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
1d950 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
1d960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d970 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
1d980 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
1d990 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
1d9a0 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20  sAgg;           
1d9b0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
1d9c0 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
1d9d0 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
1d9e0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1d9f0 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
1da00 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
1da10 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
1da20 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
1da30 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
1da40 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
1da50 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
1da60 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
1da70 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1da80 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
1da90 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1daa0 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20  pOrderBy;    /* 
1dab0 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
1dac0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
1dad0 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
1dae0 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
1daf0 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
1db00 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
1db10 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
1db20 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
1db30 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
1db40 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
1db50 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44 69 73  L */.  int isDis
1db60 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
1db70 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
1db80 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
1db90 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
1dba0 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20 20 20  t distinct;     
1dbb0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1dbc0 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
1dbd0 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20 20 69  tinct set */.  i
1dbe0 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
1dbf0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
1dc00 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
1dc10 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
1dc20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64   int addrSortInd
1dc30 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  ex;     /* Addre
1dc40 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e  ss of an OP_Open
1dc50 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
1dc60 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67 49 6e  ction */.  AggIn
1dc70 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20  fo sAggInfo;    
1dc80 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1dc90 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61   used by aggrega
1dca0 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
1dcb0 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20  int iEnd;       
1dcc0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1dcd0 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20  s of the end of 
1dce0 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  the query */.  s
1dcf0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
1dd00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1dd10 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1dd20 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72   */..  db = pPar
1dd30 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d  se->db;.  if( p=
1dd40 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
1dd50 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
1dd60 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65  ->nErr ){.    re
1dd70 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
1dd80 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1dd90 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1dda0 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
1ddb0 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
1ddc0 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66   memset(&sAggInf
1ddd0 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67  o, 0, sizeof(sAg
1dde0 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 70 4f 72 64  gInfo));..  pOrd
1ddf0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1de00 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61  By;.  if( Ignora
1de10 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
1de20 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ) ){.    p->pOrd
1de30 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  erBy = 0;..    /
1de40 2a 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  * In these cases
1de50 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f 70   the DISTINCT op
1de60 65 72 61 74 6f 72 20 6d 61 6b 65 73 20 6e 6f 20  erator makes no 
1de70 64 69 66 66 65 72 65 6e 63 65 20 74 6f 20 74 68  difference to th
1de80 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73  e.    ** results
1de90 2c 20 73 6f 20 72 65 6d 6f 76 65 20 69 74 20 69  , so remove it i
1dea0 66 20 69 74 20 77 65 72 65 20 73 70 65 63 69 66  f it were specif
1deb0 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
1dec0 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44  assert(pDest->eD
1ded0 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20  est==SRT_Exists 
1dee0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
1def0 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20  =SRT_Union || . 
1df00 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
1df10 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65  >eDest==SRT_Exce
1df20 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  pt || pDest->eDe
1df30 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 29  st==SRT_Discard)
1df40 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
1df50 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
1df60 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
1df70 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73  SelectPrep(pPars
1df80 65 2c 20 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  e, p, 0);.  if( 
1df90 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
1dfa0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
1dfb0 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4f  end;.  }.  p->pO
1dfc0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
1dfd0 79 3b 0a 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6c  y;...  /* Make l
1dfe0 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66 20 74  ocal copies of t
1dff0 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f  he parameters fo
1e000 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a 20 20  r this query..  
1e010 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  */.  pTabList = 
1e020 70 2d 3e 70 53 72 63 3b 0a 20 20 69 73 41 67 67  p->pSrc;.  isAgg
1e030 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
1e040 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
1e050 3d 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  =0;.  pEList = p
1e060 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20  ->pEList;.  if( 
1e070 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f  pEList==0 ) goto
1e080 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
1e090 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  /* .  ** Do not 
1e0a0 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  even attempt to 
1e0b0 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63 6f 64  generate any cod
1e0c0 65 20 69 66 20 77 65 20 68 61 76 65 20 61 6c 72  e if we have alr
1e0d0 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65  eady seen.  ** e
1e0e0 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74 68 69  rrors before thi
1e0f0 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
1e100 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
1e110 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f  rse->nErr>0 ) go
1e120 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
1e130 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 69 73    /* ORDER BY is
1e140 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d   ignored for som
1e150 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a  e destinations..
1e160 20 20 2a 2f 0a 20 20 69 66 28 20 49 67 6e 6f 72    */.  if( Ignor
1e170 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
1e180 74 29 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  t) ){.    pOrder
1e190 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
1e1a0 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69  * Begin generati
1e1b0 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng code..  */.  
1e1c0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1e1d0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1e1e0 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
1e1f0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
1e200 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1e210 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
1e220 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
1e230 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ause.  */.#if !d
1e240 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1e250 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1e260 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1e270 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
1e280 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72  (i=0; !p->pPrior
1e290 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e   && i<pTabList->
1e2a0 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
1e2b0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1e2c0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
1e2d0 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
1e2e0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
1e2f0 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
1e300 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
1e310 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  lect;.    int is
1e320 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69 66 28  AggSub;..    if(
1e330 20 70 53 75 62 3d 3d 30 20 7c 7c 20 70 49 74 65   pSub==0 || pIte
1e340 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 29  m->isPopulated )
1e350 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
1e360 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72  /* Increment Par
1e370 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68  se.nHeight by th
1e380 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20  e height of the 
1e390 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69  largest expressi
1e3a0 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72  on.    ** tree r
1e3b0 65 66 65 72 65 64 20 74 6f 20 62 79 20 74 68 69  efered to by thi
1e3c0 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65  s, the parent se
1e3d0 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20  lect. The child 
1e3e0 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61  select.    ** ma
1e3f0 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73  y contain expres
1e400 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74  sion trees of at
1e410 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51   most.    ** (SQ
1e420 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
1e430 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68  PTH-Parse.nHeigh
1e440 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20  t) height. This 
1e450 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20  is a bit.    ** 
1e460 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76  more conservativ
1e470 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  e than necessary
1e480 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65  , but much easie
1e490 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67  r than enforcing
1e4a0 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74  .    ** an exact
1e4b0 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   limit..    */. 
1e4c0 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
1e4d0 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht += sqlite3Sel
1e4e0 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
1e4f0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
1e500 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 75  to see if the su
1e510 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
1e520 73 6f 72 62 65 64 20 69 6e 74 6f 20 74 68 65 20  sorbed into the 
1e530 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69  parent. */.    i
1e540 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d  sAggSub = (pSub-
1e550 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
1e560 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
1e570 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62    if( flattenSub
1e580 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  query(pParse, p,
1e590 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67   i, isAgg, isAgg
1e5a0 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 69 66  Sub) ){.      if
1e5b0 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20  ( isAggSub ){.  
1e5c0 20 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b        isAgg = 1;
1e5d0 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
1e5e0 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65  lags |= SF_Aggre
1e5f0 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gate;.      }.  
1e600 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
1e610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1e620 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
1e630 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70  it(&dest, SRT_Ep
1e640 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69  hemTab, pItem->i
1e650 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 61  Cursor);.      a
1e660 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 73  ssert( pItem->is
1e670 50 6f 70 75 6c 61 74 65 64 3d 3d 30 20 29 3b 0a  Populated==0 );.
1e680 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
1e690 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
1e6a0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
1e6b0 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74  pItem->isPopulat
1e6c0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
1e6d0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1e6e0 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
1e6f0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
1e700 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1e710 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
1e720 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
1e730 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
1e740 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54  eight(p);.    pT
1e750 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
1e760 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
1e770 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
1e780 74 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64  t) ){.      pOrd
1e790 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1e7a0 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  By;.    }.  }.  
1e7b0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
1e7c0 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68  st;.#endif.  pWh
1e7d0 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
1e7e0 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
1e7f0 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
1e800 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
1e810 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63 74 20  g;.  isDistinct 
1e820 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
1e830 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1e840 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1e850 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
1e860 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74  SELECT.  /* If t
1e870 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
1e880 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
1e890 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
1e8a0 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
1e8b0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
1e8c0 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  or ){.    if( p-
1e8d0 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29  >pRightmost==0 )
1e8e0 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  {.      Select *
1e8f0 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d  pLoop, *pRight =
1e900 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e   0;.      int cn
1e910 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
1e920 20 6d 78 53 65 6c 65 63 74 3b 0a 20 20 20 20 20   mxSelect;.     
1e930 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
1e940 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
1e950 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29  ->pPrior, cnt++)
1e960 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
1e970 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b  >pRightmost = p;
1e980 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
1e990 70 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a  pNext = pRight;.
1e9a0 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
1e9b0 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a   pLoop;.      }.
1e9c0 20 20 20 20 20 20 6d 78 53 65 6c 65 63 74 20 3d        mxSelect =
1e9d0 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
1e9e0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
1e9f0 44 5f 53 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20  D_SELECT];.     
1ea00 20 69 66 28 20 6d 78 53 65 6c 65 63 74 20 26 26   if( mxSelect &&
1ea10 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b   cnt>mxSelect ){
1ea20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ea30 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1ea40 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73   "too many terms
1ea50 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c   in compound SEL
1ea60 45 43 54 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ECT");.        r
1ea70 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
1ea80 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1ea90 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  n multiSelect(pP
1eaa0 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
1eab0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1eac0 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20  * If writing to 
1ead0 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61  memory or genera
1eae0 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20  ting a set.  ** 
1eaf0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f  only a single co
1eb00 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70  lumn may be outp
1eb10 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ut..  */.#ifndef
1eb20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1eb30 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65 63  QUERY.  if( chec
1eb40 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
1eb50 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
1eb60 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74  e, pDest, pEList
1eb70 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
1eb80 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1eb90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1eba0 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72  * If possible, r
1ebb0 65 77 72 69 74 65 20 74 68 65 20 71 75 65 72 79  ewrite the query
1ebc0 20 74 6f 20 75 73 65 20 47 52 4f 55 50 20 42 59   to use GROUP BY
1ebd0 20 69 6e 73 74 65 61 64 20 6f 66 20 44 49 53 54   instead of DIST
1ebe0 49 4e 43 54 2e 0a 20 20 2a 2a 20 47 52 4f 55 50  INCT..  ** GROUP
1ebf0 20 42 59 20 6d 69 67 68 74 20 75 73 65 20 61 6e   BY might use an
1ec00 20 69 6e 64 65 78 2c 20 44 49 53 54 49 4e 43 54   index, DISTINCT
1ec10 20 6e 65 76 65 72 20 64 6f 65 73 2e 0a 20 20 2a   never does..  *
1ec20 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
1ec30 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
1ec40 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
1ec50 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
1ec60 26 26 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20  && !p->pGroupBy 
1ec70 29 7b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70  ){.    p->pGroup
1ec80 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
1ec90 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
1eca0 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 47 72 6f  EList);.    pGro
1ecb0 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1ecc0 42 79 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c  By;.    p->selFl
1ecd0 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
1ece0 6e 63 74 3b 0a 20 20 20 20 69 73 44 69 73 74 69  nct;.    isDisti
1ecf0 6e 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  nct = 0;.  }..  
1ed00 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
1ed10 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1ed20 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72  e, then this sor
1ed30 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
1ed40 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69  might end up bei
1ed50 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65  ng unused if the
1ed60 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20   data can be .  
1ed70 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e 20  ** extracted in 
1ed80 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72  pre-sorted order
1ed90 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
1eda0 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
1edb0 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68  .  ** OP_OpenEph
1edc0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
1edd0 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  on will be chang
1ede0 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70  ed to an OP_Noop
1edf0 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69   once.  ** we fi
1ee00 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
1ee10 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
1ee20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20  is not needed.  
1ee30 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65  The addrSortInde
1ee40 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20  x.  ** variable 
1ee50 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c  is used to facil
1ee60 69 74 61 74 65 20 74 68 61 74 20 63 68 61 6e 67  itate that chang
1ee70 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  e..  */.  if( pO
1ee80 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
1ee90 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
1eea0 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
1eeb0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
1eec0 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
1eed0 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64 65  erBy);.    pOrde
1eee0 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
1eef0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
1ef00 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
1ef10 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72  phm[2] = addrSor
1ef20 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
1ef30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ef40 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
1ef50 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
1ef80 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  sor, pOrderBy->n
1ef90 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
1efc0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
1efd0 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65  O_HANDOFF);.  }e
1efe0 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53 6f 72  lse{.    addrSor
1eff0 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d  tIndex = -1;.  }
1f000 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
1f010 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
1f020 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
1f030 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
1f040 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
1f050 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
1f060 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
1f070 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1f080 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
1f090 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65  enEphemeral, pDe
1f0a0 73 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c 69 73  st->iParm, pELis
1f0b0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
1f0c0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
1f0d0 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e  iter..  */.  iEn
1f0e0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
1f0f0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63  akeLabel(v);.  c
1f100 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
1f110 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
1f120 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  iEnd);..  /* Ope
1f130 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  n a virtual inde
1f140 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  x to use for the
1f150 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20   distinct set.. 
1f160 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69 73 74   */.  if( isDist
1f170 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65 79 49  inct ){.    KeyI
1f180 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1f190 20 20 20 61 73 73 65 72 74 28 20 69 73 41 67 67     assert( isAgg
1f1a0 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29 3b 0a   || pGroupBy );.
1f1b0 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20 70      distinct = p
1f1c0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1f1d0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
1f1e0 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
1f1f0 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  t(pParse, p->pEL
1f200 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
1f210 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1f220 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
1f230 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c   distinct, 0, 0,
1f240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f250 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1f260 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
1f270 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
1f280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69 73 74   }else{.    dist
1f290 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  inct = -1;.  }..
1f2a0 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 61    /* Aggregate a
1f2b0 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65  nd non-aggregate
1f2c0 20 71 75 65 72 69 65 73 20 61 72 65 20 68 61 6e   queries are han
1f2d0 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
1f2e0 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41 67 67   */.  if( !isAgg
1f2f0 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
1f300 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
1f310 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e 2d 61  ase is for non-a
1f320 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
1f330 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20 74 68  .    ** Begin th
1f340 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 0a  e database scan.
1f350 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66      */.    pWInf
1f360 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
1f370 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
1f380 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
1f390 26 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20  &pOrderBy, 0);. 
1f3a0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
1f3b0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
1f3c0 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73  nd;..    /* If s
1f3d0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
1f3e0 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
1f3f0 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
1f400 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
1f410 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
1f420 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
1f430 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
1f440 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
1f450 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
1f460 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
1f470 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1f480 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d   addrSortIndex>=
1f490 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 && pOrderBy==0
1f4a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1f4b0 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
1f4c0 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  p(v, addrSortInd
1f4d0 65 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 2d  ex, 1);.      p-
1f4e0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
1f4f0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20   = -1;.    }..  
1f500 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61    /* Use the sta
1f510 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70  ndard inner loop
1f520 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1f530 72 74 28 21 69 73 44 69 73 74 69 6e 63 74 29 3b  rt(!isDistinct);
1f540 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  .    selectInner
1f550 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
1f560 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f  pEList, 0, 0, pO
1f570 72 64 65 72 42 79 2c 20 2d 31 2c 20 70 44 65 73  rderBy, -1, pDes
1f580 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1f590 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69         pWInfo->i
1f5a0 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e 66 6f  Continue, pWInfo
1f5b0 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 20 20  ->iBreak);..    
1f5c0 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
1f5d0 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  ase scan loop.. 
1f5e0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
1f5f0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
1f600 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f610 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 70  /* This is the p
1f620 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67  rocessing for ag
1f630 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
1f640 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
1f650 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
1f660 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
1f670 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
1f680 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
1f690 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
1f6a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
1f6b0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
1f6c0 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
1f6d0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
1f6e0 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
1f6f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1f700 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
1f710 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
1f720 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
1f730 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
1f740 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
1f750 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
1f760 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
1f770 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
1f780 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
1f790 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
1f7a0 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
1f7b0 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7d0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1f7e0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
1f7f0 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
1f800 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
1f810 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
1f820 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
1f830 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
1f840 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
1f850 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
1f860 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
1f870 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69  Y order */.    i
1f880 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
1f890 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f     /* End of pro
1f8a0 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
1f8b0 20 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20   SELECT */..    
1f8c0 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e  /* Remove any an
1f8d0 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65  d all aliases be
1f8e0 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74  tween the result
1f8f0 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20   set and the.   
1f900 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61   ** GROUP BY cla
1f910 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
1f920 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
1f930 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
1f940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f950 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1f960 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  ter */.      str
1f970 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1f980 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f  m *pItem;  /* Fo
1f990 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
1f9a0 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c  xpression in a l
1f9b0 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  ist */..      fo
1f9c0 72 28 69 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r(i=p->pEList->n
1f9d0 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70  Expr, pItem=p->p
1f9e0 45 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69  EList->a; i>0; i
1f9f0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
1fa00 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c        pItem->iAl
1fa10 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
1fa20 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 47 72  .      for(i=pGr
1fa30 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49  oupBy->nExpr, pI
1fa40 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
1fa50 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
1fa60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
1fa70 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  em->iAlias = 0;.
1fa80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1fa90 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
1faa0 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74   label to jump t
1fab0 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  o when we want t
1fac0 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72  o abort the quer
1fad0 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64  y */.    addrEnd
1fae0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1faf0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20  keLabel(v);..   
1fb00 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43   /* Convert TK_C
1fb10 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f  OLUMN nodes into
1fb20 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61   TK_AGG_COLUMN a
1fb30 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20  nd make entries 
1fb40 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e  in.    ** sAggIn
1fb50 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47  fo for all TK_AG
1fb60 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73  G_FUNCTION nodes
1fb70 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20   in expressions 
1fb80 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45  of the.    ** SE
1fb90 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
1fba0 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
1fbb0 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
1fbc0 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
1fbd0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
1fbe0 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
1fbf0 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
1fc00 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20     sNC.pAggInfo 
1fc10 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20  = &sAggInfo;.   
1fc20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
1fc30 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
1fc40 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
1fc50 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20  nExpr+1 : 0;.   
1fc60 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70   sAggInfo.pGroup
1fc70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
1fc80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
1fc90 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
1fca0 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  C, pEList);.    
1fcb0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1fcc0 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
1fcd0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
1fce0 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
1fcf0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
1fd00 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
1fd10 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
1fd20 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
1fd30 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
1fd40 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
1fd50 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  umn;.    for(i=0
1fd60 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75  ; i<sAggInfo.nFu
1fd70 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nc; i++){.      
1fd80 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
1fd90 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
1fda0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
1fdb0 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b  ].pExpr->pList);
1fdc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
1fdd0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1fde0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1fdf0 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65  d;..    /* Proce
1fe00 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
1fe10 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20  ates with GROUP 
1fe20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65  BY is very diffe
1fe30 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  rent and.    ** 
1fe40 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  much more comple
1fe50 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65  x than aggregate
1fe60 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55  s without a GROU
1fe70 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  P BY..    */.   
1fe80 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
1fe90 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
1fea0 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65  pKeyInfo;  /* Ke
1feb0 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ying information
1fec0 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62   for the group b
1fed0 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  y clause */.    
1fee0 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20    int j1;       
1fef0 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20        /* A-vs-B 
1ff00 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70  comparision jump
1ff10 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
1ff20 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a  drOutputRow;  /*
1ff30 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75   Start of subrou
1ff40 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
1ff50 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  s a result row *
1ff60 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f  /.      int regO
1ff70 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52  utputRow;   /* R
1ff80 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
1ff90 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75  gister for outpu
1ffa0 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  t subroutine */.
1ffb0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65        int addrSe
1ffc0 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74  tAbort;   /* Set
1ffd0 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20   the abort flag 
1ffe0 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
1fff0 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f      int addrTopO
20000 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f  fLoop;  /* Top o
20010 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  f the input loop
20020 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
20030 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a  drSortingIdx; /*
20040 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
20050 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f  meral for the so
20060 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  rting index */. 
20070 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73       int addrRes
20080 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72  et;      /* Subr
20090 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74  outine for reset
200a0 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
200b0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ator */.      in
200c0 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20  t regReset;     
200d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
200e0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
200f0 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e   reset subroutin
20100 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49  e */..      /* I
20110 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f  f there is a GRO
20120 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20  UP BY clause we 
20130 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72  might need a sor
20140 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20  ting index to.  
20150 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
20160 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74   it.  Allocate t
20170 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  hat sorting inde
20180 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75  x now.  If it tu
20190 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a  rns out.      **
201a0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
201b0 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c  need it after al
201c0 6c 2c 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d  l, the OpenEphem
201d0 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
201e0 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
201f0 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
20200 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20   a Noop.  .     
20210 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e   */.      sAggIn
20220 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20  fo.sortingIdx = 
20230 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
20240 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
20250 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
20260 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
20270 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64  oupBy);.      ad
20280 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73  drSortingIdx = s
20290 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
202a0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
202b0 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  eral, .         
202c0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
202d0 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  gIdx, sAggInfo.n
202e0 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a  SortingColumn, .
202f0 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68            0, (ch
20300 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
20310 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
20320 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
20330 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
20340 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
20350 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
20360 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
20370 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
20380 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  seFlag = ++pPars
20390 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
203a0 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50  AbortFlag = ++pP
203b0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
203c0 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d    regOutputRow =
203d0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
203e0 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
203f0 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
20400 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
20410 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d        regReset =
20420 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
20430 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
20440 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
20450 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
20460 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
20470 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
20480 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
20490 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
204a0 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
204b0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
204c0 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
204d0 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
204e0 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
204f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20500 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
20510 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
20520 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
20530 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62  nt((v, "clear ab
20540 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
20550 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20560 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
20570 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29  er, 0, iUseFlag)
20580 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
20590 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
205a0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d  e accumulator em
205b0 70 74 79 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  pty"));..      /
205c0 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
205d0 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
205e0 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
205f0 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
20600 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
20610 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
20620 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
20630 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
20640 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
20650 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
20660 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
20670 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
20680 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
20690 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
206a0 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
206b0 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
206c0 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
206d0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
206e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
206f0 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
20700 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
20710 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
20720 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
20730 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
20740 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70   pWhere, &pGroup
20750 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  By, 0);.      if
20760 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
20770 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
20780 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42       if( pGroupB
20790 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
207a0 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
207b0 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
207c0 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
207d0 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
207e0 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
207f0 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
20800 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
20810 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
20820 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
20830 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
20840 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
20850 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
20860 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
20870 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72    */.        pGr
20880 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
20890 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f  pBy;.        gro
208a0 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
208b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
208c0 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
208d0 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
208e0 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
208f0 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
20900 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
20910 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
20920 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
20930 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
20940 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
20950 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
20960 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
20970 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
20980 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
20990 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
209a0 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
209b0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
209c0 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
209d0 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
209e0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
209f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
20a00 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
20a10 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
20a20 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
20a30 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
20a40 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
20a50 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31  l = nGroupBy + 1
20a60 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
20a70 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20  roupBy+1;.      
20a80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
20a90 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
20aa0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
20ab0 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  f( sAggInfo.aCol
20ac0 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  [i].iSorterColum
20ad0 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
20ae0 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
20af0 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
20b00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20b10 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61   }.        regBa
20b20 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
20b30 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
20b40 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
20b50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
20b60 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
20b70 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
20b80 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
20b90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20ba0 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
20bb0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
20bc0 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72  gIdx,regBase+nGr
20bd0 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20  oupBy);.        
20be0 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a  j = nGroupBy+1;.
20bf0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
20c00 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
20c10 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
20c20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
20c30 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
20c40 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
20c50 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
20c60 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
20c70 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
20c80 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
20c90 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
20ca0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b           int r2;
20cb0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32  ..            r2
20cc0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
20cd0 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
20ce0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d00 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
20d10 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
20d20 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c  Col->iTable, r1,
20d30 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
20d40 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20   if( r1!=r2 ){. 
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
20d60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20d70 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20  , OP_SCopy, r2, 
20d80 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
20d90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a   }.            j
20da0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
20db0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20dc0 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
20dd0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
20de0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
20df0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20e00 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
20e10 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
20e20 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
20e30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20e40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20e50 49 64 78 49 6e 73 65 72 74 2c 20 73 41 67 67 49  IdxInsert, sAggI
20e60 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
20e70 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
20e80 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
20e90 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
20ea0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
20eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
20ec0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
20ed0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
20ee0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
20ef0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
20f00 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
20f10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20f20 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73 41 67  (v, OP_Sort, sAg
20f30 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
20f40 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
20f50 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
20f60 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f  (v, "GROUP BY so
20f70 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73  rt"));.        s
20f80 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69  AggInfo.useSorti
20f90 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20  ngIdx = 1;.     
20fa0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61   }..      /* Eva
20fb0 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e  luate the curren
20fc0 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
20fd0 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30   and store in b0
20fe0 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20  , b1, b2....    
20ff0 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f    ** (b0 is memo
21000 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65  ry location iBMe
21010 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d  m+0, b1 is iBMem
21020 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  +1, and so forth
21030 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  ).      ** Then 
21040 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72  compare the curr
21050 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
21060 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47  ms against the G
21070 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20  ROUP BY terms.  
21080 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
21090 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72  previous row cur
210a0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
210b0 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20   a0, a1, a2.... 
210c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
210d0 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71  drTopOfLoop = sq
210e0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
210f0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66  Addr(v);.      f
21100 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
21110 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
21120 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f  .        if( gro
21130 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
21140 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21150 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
21160 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f 2e 73  lumn, sAggInfo.s
21170 6f 72 74 69 6e 67 49 64 78 2c 20 6a 2c 20 69 42  ortingIdx, j, iB
21180 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
21190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
211a0 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74   sAggInfo.direct
211b0 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Mode = 1;.      
211c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
211d0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
211e0 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  upBy->a[j].pExpr
211f0 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
21200 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21210 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21220 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
21230 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65  are, iAMem, iBMe
21240 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
21250 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
21270 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
21280 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
21290 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
212a0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
212b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
212c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
212d0 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a  Jump, j1+1, 0, j
212e0 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  1+1);..      /* 
212f0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
21300 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72  at runs whenever
21310 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68   the GROUP BY ch
21320 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  anges..      ** 
21330 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47  Changes in the G
21340 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65  ROUP BY are dete
21350 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76  cted by the prev
21360 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20  ious code.      
21370 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68  ** block.  If th
21380 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e  ere were no chan
21390 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20  ges, this block 
213a0 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20  is skipped..    
213b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
213c0 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63  is code copies c
213d0 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20  urrent group by 
213e0 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62  terms in b0,b1,b
213f0 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f  2,....      ** o
21400 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e  ver to a0,a1,a2.
21410 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20    It then calls 
21420 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
21430 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61  utine.      ** a
21440 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67  nd resets the ag
21450 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
21460 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e  tor registers in
21470 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20   preparation.   
21480 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65     ** for the ne
21490 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63  xt GROUP BY batc
214a0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
214b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
214c0 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42  eMove(pParse, iB
214d0 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f  Mem, iAMem, pGro
214e0 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  upBy->nExpr);.  
214f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21500 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
21510 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
21520 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
21530 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
21540 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f  nt((v, "output o
21550 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20  ne row"));.     
21560 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21570 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
21580 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72  iAbortFlag, addr
21590 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65  End);.      Vdbe
215a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65  Comment((v, "che
215b0 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ck abort flag"))
215c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
215d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
215e0 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c  Gosub, regReset,
215f0 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
21600 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
21610 76 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75  v, "reset accumu
21620 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
21630 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
21640 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
21650 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74  ators based on t
21660 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20  he content of.  
21670 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
21680 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a  nt row.      */.
21690 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
216a0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
216b0 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63  ;.      updateAc
216c0 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
216d0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
216e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
216f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
21700 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67  ger, 1, iUseFlag
21710 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
21720 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
21730 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d  te data in accum
21740 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
21750 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
21760 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20  loop.      */.  
21770 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
21780 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
21790 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
217a0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73 41 67  (v, OP_Next, sAg
217b0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
217c0 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29  , addrTopOfLoop)
217d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
217e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
217f0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
21800 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21810 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
21820 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  v, addrSortingId
21830 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  x, 1);.      }..
21840 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
21850 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66  the final row of
21860 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f   result.      */
21870 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21880 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
21890 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
218a0 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
218b0 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
218c0 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
218d0 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a  t final row"));.
218e0 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f  .      /* Jump o
218f0 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69  ver the subrouti
21900 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nes.      */.   
21910 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21920 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
21930 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20   0, addrEnd);.. 
21940 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
21950 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
21960 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
21970 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
21980 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
21990 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
219a0 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
219b0 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
219c0 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
219d0 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
219e0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
219f0 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
21a00 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
21a10 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
21a20 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
21a30 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
21a40 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
21a50 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
21a60 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
21a70 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
21a80 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
21a90 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
21aa0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
21ab0 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
21ac0 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
21ad0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21ae0 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
21af0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
21b00 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
21b10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21b20 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
21b30 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
21b40 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
21b50 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72  nt((v, "set abor
21b60 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
21b70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21b80 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
21b90 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
21ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21bb0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
21bc0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
21bd0 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
21be0 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
21bf0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
21c00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21c10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
21c20 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c  IfPos, iUseFlag,
21c30 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32   addrOutputRow+2
21c40 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
21c50 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62  ment((v, "Groupb
21c60 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
21c70 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29  or entry point")
21c80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21c90 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
21ca0 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
21cb0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69  utRow);.      fi
21cc0 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
21cd0 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
21ce0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
21cf0 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
21d00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
21d10 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
21d20 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70  Having, addrOutp
21d30 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f  utRow+1, SQLITE_
21d40 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
21d50 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63     }.      selec
21d60 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
21d70 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
21d80 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
21d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21da0 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 2c         distinct,
21db0 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
21dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
21dd0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
21de0 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20  ddrSetAbort);.  
21df0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21e00 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
21e10 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
21e20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
21e30 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72  ment((v, "end gr
21e40 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
21e50 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
21e60 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
21e70 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
21e80 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
21e90 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
21ea0 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
21eb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
21ec0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
21ed0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
21ee0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
21ef0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
21f00 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
21f10 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
21f20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
21f30 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  set);.     .    
21f40 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
21f50 70 42 79 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  pBy */.    else 
21f60 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
21f70 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20   *pMinMax = 0;. 
21f80 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
21f90 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  Del = 0;.      u
21fa0 38 20 66 6c 61 67 3b 0a 0a 20 20 20 20 20 20 2f  8 flag;..      /
21fb0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 71  * Check if the q
21fc0 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f  uery is of one o
21fd0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
21fe0 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  forms:.      **.
21ff0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
22000 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e  T min(x) FROM ..
22010 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c  ..      **   SEL
22020 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20  ECT max(x) FROM 
22030 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ....      **.   
22040 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20     ** If it is, 
22050 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64  then ask the cod
22060 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20  e in where.c to 
22070 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20  attempt to sort 
22080 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a  results.      **
22090 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73   as if there was
220a0 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22   an "ORDER ON x"
220b0 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20   or "ORDER ON x 
220c0 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20  DESC" clause. . 
220d0 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65       ** If where
220e0 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72  .c is able to pr
220f0 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f  oduce results so
22100 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64  rted in this ord
22110 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  er, then.      *
22120 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64 65 20  * add vdbe code 
22130 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20  to break out of 
22140 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  the processing l
22150 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a 20  oop after the . 
22160 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74       ** first it
22170 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74  eration (since t
22180 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
22190 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  on of the loop i
221a0 73 20 0a 20 20 20 20 20 20 2a 2a 20 67 75 61 72  s .      ** guar
221b0 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74  anteed to operat
221c0 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74  e on the row wit
221d0 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  h the minimum or
221e0 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20   maximum .      
221f0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74  ** value of x, t
22200 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75  he only row requ
22210 69 72 65 64 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  ired)..      **.
22220 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69        ** A speci
22230 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20  al flag must be 
22240 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
22250 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f  3WhereBegin() to
22260 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20   slightly.      
22270 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69  ** modify behavi
22280 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  our as follows:.
22290 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
222a0 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75 65  *   + If the que
222b0 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54 20  ry is a "SELECT 
222c0 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68  min(x)", then th
222d0 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a  e loop coded by.
222e0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65        **     whe
222f0 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20  re.c should not 
22300 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79  iterate over any
22310 20 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e   values with a N
22320 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20  ULL value.      
22330 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20  **     for x..  
22340 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
22350 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65    + The optimize
22360 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  r code in where.
22370 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61  c (the thing tha
22380 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a  t decides which.
22390 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64        **     ind
223a0 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f  ex or indices to
223b0 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61   use) should pla
223c0 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  ce a different p
223d0 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20  riority on .    
223e0 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79    **     satisfy
223f0 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42  ing the 'ORDER B
22400 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69  Y' clause than i
22410 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20  t does in other 
22420 63 61 73 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  cases..      ** 
22430 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64      Refer to cod
22440 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69  e and comments i
22450 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65  n where.c for de
22460 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  tails..      */.
22470 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e        flag = min
22480 4d 61 78 51 75 65 72 79 28 70 50 61 72 73 65 2c  MaxQuery(pParse,
22490 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66   p);.      if( f
224a0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  lag ){.        p
224b0 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 20 3d 20  Del = pMinMax = 
224c0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
224d0 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
224e0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 70 4c  ->a[0].pExpr->pL
224f0 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ist);.        if
22500 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62  ( pMinMax && !db
22510 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
22520 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e  {.          pMin
22530 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  Max->a[0].sortOr
22540 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52  der = flag!=WHER
22550 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  E_ORDERBY_MIN;. 
22560 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
22570 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
22580 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
22590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
225a0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
225b0 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20  ase runs if the 
225c0 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f  aggregate has no
225d0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
225e0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
225f0 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75  processing is mu
22600 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65  ch simpler since
22610 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61   there is only a
22620 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20   single row.    
22630 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
22640 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
22650 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
22660 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
22670 6f 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  o);.      pWInfo
22680 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
22690 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
226a0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26  bList, pWhere, &
226b0 70 4d 69 6e 4d 61 78 2c 20 66 6c 61 67 29 3b 0a  pMinMax, flag);.
226c0 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
226d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
226e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
226f0 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
22700 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
22710 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
22720 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63  .      updateAcc
22730 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
22740 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
22750 20 20 20 69 66 28 20 21 70 4d 69 6e 4d 61 78 20     if( !pMinMax 
22760 26 26 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  && flag ){.     
22770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22780 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
22790 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65   0, pWInfo->iBre
227a0 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ak);.        Vdb
227b0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
227c0 28 29 20 62 79 20 69 6e 64 65 78 22 2c 28 66 6c  () by index",(fl
227d0 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag==WHERE_ORDERB
227e0 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78  Y_MIN?"min":"max
227f0 22 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ")));.      }.  
22800 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
22810 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
22820 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
22830 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
22840 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
22850 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
22860 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e        if( pHavin
22870 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
22880 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
22890 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
228a0 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45   addrEnd, SQLITE
228b0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
228c0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65      }.      sele
228d0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
228e0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
228f0 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 0a  , 0, 0, 0, -1, .
22900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22910 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
22920 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a  rEnd, addrEnd);.
22930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
22940 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
22950 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pDel);.    }.  
22960 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
22970 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
22980 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20  rEnd);.    .  } 
22990 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65 67 61  /* endif aggrega
229a0 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 2f  te query */..  /
229b0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
229c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
229d0 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
229e0 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
229f0 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
22a00 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
22a10 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
22a20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72  ..  */.  if( pOr
22a30 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67 65 6e  derBy ){.    gen
22a40 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50  erateSortTail(pP
22a50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69  arse, p, v, pELi
22a60 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74  st->nExpr, pDest
22a70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
22a80 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
22a90 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20  his query.  */. 
22aa0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
22ab0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64  lveLabel(v, iEnd
22ac0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c  );..  /* The SEL
22ad0 45 43 54 20 77 61 73 20 73 75 63 63 65 73 73 66  ECT was successf
22ae0 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65  ully coded.   Se
22af0 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
22b00 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69  e to 0.  ** to i
22b10 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72  ndicate no error
22b20 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30  s..  */.  rc = 0
22b30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20  ;..  /* Control 
22b40 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66  jumps to here if
22b50 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
22b60 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20  ountered above, 
22b70 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63  or upon.  ** suc
22b80 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f  cessful coding o
22b90 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20  f the SELECT..  
22ba0 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 0a  */.select_end:..
22bb0 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63 6f    /* Identify co
22bc0 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72 65  lumn names if re
22bd0 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45 4c  sults of the SEL
22be0 45 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f 75  ECT are to be ou
22bf0 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tput..  */.  if(
22c00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22c10 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  & pDest->eDest==
22c20 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
22c30 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
22c40 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
22c50 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
22c60 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44  .  }..  sqlite3D
22c70 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
22c80 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  fo.aCol);.  sqli
22c90 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
22ca0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 20  ggInfo.aFunc);. 
22cb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
22cc0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
22cd0 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 2a 2a  E_DEBUG)./*.****
22ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
22d30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
22d40 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
22d50 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
22d60 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63  ing only.  The c
22d70 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66 6f 6c 6c  ode.** that foll
22d80 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  ows does not app
22d90 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20 62 75  ear in normal bu
22da0 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  ilds..**.** Thes
22db0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
22dc0 73 65 64 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  sed to print out
22dd0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
22de0 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f 66 20 61  all or part of a
22df0 20 0a 2a 2a 20 70 61 72 73 65 20 73 74 72 75 63   .** parse struc
22e00 74 75 72 65 73 20 73 75 63 68 20 61 73 20 53 65  tures such as Se
22e10 6c 65 63 74 20 6f 72 20 45 78 70 72 2e 20 20 53  lect or Expr.  S
22e20 75 63 68 20 70 72 69 6e 74 6f 75 74 73 20 61 72  uch printouts ar
22e30 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  e useful.** for 
22e40 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e 64 65 72  helping to under
22e50 73 74 61 6e 64 20 77 68 61 74 20 69 73 20 68 61  stand what is ha
22e60 70 70 65 6e 69 6e 67 20 69 6e 73 69 64 65 20 74  ppening inside t
22e70 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
22e80 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20  r.** during the 
22e90 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 6f 6d  execution of com
22ea0 70 6c 65 78 20 53 45 4c 45 43 54 20 73 74 61 74  plex SELECT stat
22eb0 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ements..**.** Th
22ec0 65 73 65 20 72 6f 75 74 69 6e 65 20 61 72 65 20  ese routine are 
22ed0 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e 79 77 68  not called anywh
22ee0 65 72 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ere from within 
22ef0 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 63 6f  the normal.** co
22f00 64 65 20 62 61 73 65 2e 20 20 54 68 65 6e 20 61  de base.  Then a
22f10 72 65 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  re intended to b
22f20 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  e called from wi
22f30 74 68 69 6e 20 74 68 65 20 64 65 62 75 67 67 65  thin the debugge
22f40 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20 74 65 6d  r.** or from tem
22f50 70 6f 72 61 72 79 20 22 70 72 69 6e 74 66 22 20  porary "printf" 
22f60 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 65 72  statements inser
22f70 74 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ted for debuggin
22f80 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  g..*/.void sqlit
22f90 65 33 50 72 69 6e 74 45 78 70 72 28 45 78 70 72  e3PrintExpr(Expr
22fa0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74   *p){.  if( p->t
22fb0 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d 3e 74 6f 6b  oken.z && p->tok
22fc0 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 73 71  en.n>0 ){.    sq
22fd0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
22fe0 28 22 28 25 2e 2a 73 22 2c 20 70 2d 3e 74 6f 6b  ("(%.*s", p->tok
22ff0 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 7a  en.n, p->token.z
23000 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23010 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23020 74 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f 70 29  tf("(%d", p->op)
23030 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
23040 4c 65 66 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Left ){.    sqli
23050 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23060 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
23070 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 4c 65  PrintExpr(p->pLe
23080 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ft);.  }.  if( p
23090 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
230a0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
230b0 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c  tf(" ");.    sql
230c0 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
230d0 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20  >pRight);.  }.  
230e0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
230f0 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69 64 20  tf(")");.}.void 
23100 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
23110 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a 70  List(ExprList *p
23120 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
23130 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
23140 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
23150 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
23160 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61 5b 69  tExpr(pList->a[i
23170 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
23180 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ( i<pList->nExpr
23190 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  -1 ){.      sqli
231a0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
231b0 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , ");.    }.  }.
231c0 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72  }.void sqlite3Pr
231d0 69 6e 74 53 65 6c 65 63 74 28 53 65 6c 65 63 74  intSelect(Select
231e0 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29   *p, int indent)
231f0 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  {.  sqlite3Debug
23200 50 72 69 6e 74 66 28 22 25 2a 73 53 45 4c 45 43  Printf("%*sSELEC
23210 54 28 25 70 29 20 22 2c 20 69 6e 64 65 6e 74 2c  T(%p) ", indent,
23220 20 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74   "", p);.  sqlit
23230 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28  e3PrintExprList(
23240 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73 71  p->pEList);.  sq
23250 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23260 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20 70 2d  ("\n");.  if( p-
23270 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 63 68 61  >pSrc ){.    cha
23280 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20 20 20  r *zPrefix;.    
23290 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72 65 66  int i;.    zPref
232a0 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20 20 20  ix = "FROM";.   
232b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70   for(i=0; i<p->p
232c0 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
232d0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
232e0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
232f0 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b  m = &p->pSrc->a[
23300 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i];.      sqlite
23310 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
23320 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c 20 7a  s ", indent+6, z
23330 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20 7a  Prefix);.      z
23340 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20  Prefix = "";.   
23350 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
23360 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
23370 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23380 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20 20 20  ntf("(\n");.    
23390 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
233a0 53 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e 70 53  Select(pItem->pS
233b0 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b 31 30  elect, indent+10
233c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
233d0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25  e3DebugPrintf("%
233e0 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38 2c 20  *s)", indent+8, 
233f0 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  "");.      }else
23400 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   if( pItem->zNam
23410 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
23420 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23430 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  "%s", pItem->zNa
23440 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
23450 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54     if( pItem->pT
23460 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ab ){.        sq
23470 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23480 28 22 28 74 61 62 6c 65 3a 20 25 73 29 22 2c 20  ("(table: %s)", 
23490 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
234a0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
234b0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
234c0 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lias ){.        
234d0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
234e0 74 66 28 22 20 41 53 20 25 73 22 2c 20 70 49 74  tf(" AS %s", pIt
234f0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
23500 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
23510 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 2d 31  <p->pSrc->nSrc-1
23520 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23530 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23540 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ,");.      }.   
23550 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23560 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20  rintf("\n");.   
23570 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
23580 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71  pWhere ){.    sq
23590 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
235a0 28 22 25 2a 73 20 57 48 45 52 45 20 22 2c 20 69  ("%*s WHERE ", i
235b0 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20  ndent, "");.    
235c0 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72  sqlite3PrintExpr
235d0 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  (p->pWhere);.   
235e0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
235f0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
23600 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79   if( p->pGroupBy
23610 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
23620 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
23630 47 52 4f 55 50 20 42 59 20 22 2c 20 69 6e 64 65  GROUP BY ", inde
23640 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
23650 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
23660 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  t(p->pGroupBy);.
23670 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23680 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
23690 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69  }.  if( p->pHavi
236a0 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ng ){.    sqlite
236b0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
236c0 73 20 48 41 56 49 4e 47 20 22 2c 20 69 6e 64 65  s HAVING ", inde
236d0 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
236e0 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
236f0 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73  >pHaving);.    s
23700 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23710 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  f("\n");.  }.  i
23720 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
23730 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
23740 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 4f 52  ugPrintf("%*s OR
23750 44 45 52 20 42 59 20 22 2c 20 69 6e 64 65 6e 74  DER BY ", indent
23760 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  , "");.    sqlit
23770 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28  e3PrintExprList(
23780 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
23790 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
237a0 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a  intf("\n");.  }.
237b0 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  }./* End of the 
237c0 73 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20  structure debug 
237d0 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a  printing code.**
237e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
237f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e  ***********/.#en
23830 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
23840 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64  QLITE_TEST) || d
23850 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
23860 42 55 47 29 20 2a 2f 0a                          BUG) */.