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

Artifact 23106fd9a9618a832abaf5dc906c79dc21755edc:


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 36 32  select.c,v 1.462
0200: 20 32 30 30 38 2f 30 38 2f 30 32 20 30 33 3a 35   2008/08/02 03:5
0210: 30 3a 33 39 20 64 72 68 20 45 78 70 20 24 0a 2a  0:39 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 21 70 4f 66 66 73 65 74 20 7c 7c  ert( !pOffset ||
0850: 20 70 4c 69 6d 69 74 20 29 3b 20 20 20 2f 2a 20   pLimit );   /* 
0860: 43 61 6e 27 74 20 68 61 76 65 20 4f 46 46 53 45  Can't have OFFSE
0870: 54 20 77 69 74 68 6f 75 74 20 4c 49 4d 49 54 2e  T without LIMIT.
0880: 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
0890: 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 ){.    pNew = 
08a0: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65  &standin;.    me
08b0: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
08c0: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
08d0: 7d 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d  }.  if( pEList==
08e0: 30 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20  0 ){.    pEList 
08f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
0900: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
0910: 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
0920: 62 2c 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c  b,TK_ALL,0,0,0),
0930: 20 30 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d   0);.  }.  pNew-
0940: 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74  >pEList = pEList
0950: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d  ;.  pNew->pSrc =
0960: 20 70 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70   pSrc;.  pNew->p
0970: 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a  Where = pWhere;.
0980: 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79    pNew->pGroupBy
0990: 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70   = pGroupBy;.  p
09a0: 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70  New->pHaving = p
09b0: 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e  Having;.  pNew->
09c0: 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
09d0: 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44  rBy;.  pNew->isD
09e0: 69 73 74 69 6e 63 74 20 3d 20 69 73 44 69 73 74  istinct = isDist
09f0: 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  inct;.  pNew->op
0a00: 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
0a10: 61 73 73 65 72 74 28 20 70 4f 66 66 73 65 74 3d  assert( pOffset=
0a20: 3d 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20  =0 || pLimit!=0 
0a30: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  );.  pNew->pLimi
0a40: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e  t = pLimit;.  pN
0a50: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f  ew->pOffset = pO
0a60: 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 61  ffset;.  pNew->a
0a70: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
0a80: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
0a90: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
0aa0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
0ab0: 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
0ac0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 26 73 74  .  if( pNew==&st
0ad0: 61 6e 64 69 6e 29 20 7b 0a 20 20 20 20 63 6c 65  andin) {.    cle
0ae0: 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65  arSelect(db, pNe
0af0: 77 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  w);.    pNew = 0
0b00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
0b10: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
0b20: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
0b30: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0b40: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
0b50: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
0b60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
0b70: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
0b80: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
0b90: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
0ba0: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
0bb0: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
0bc0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
0bd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
0be0: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
0bf0: 66 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67  fiers preceeding
0c00: 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72   the JOIN keywor
0c10: 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  d, determine the
0c20: 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e  .** type of join
0c30: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
0c40: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  eger constant th
0c50: 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61  at expresses tha
0c60: 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72  t type.** in ter
0c70: 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ms of the follow
0c80: 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a  ing bit values:.
0c90: 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e  **.**     JT_INN
0ca0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f  ER.**     JT_CRO
0cb0: 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54  SS.**     JT_OUT
0cc0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54  ER.**     JT_NAT
0cd0: 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c  URAL.**     JT_L
0ce0: 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49  EFT.**     JT_RI
0cf0: 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c  GHT.**.** A full
0d00: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74   outer join is t
0d10: 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  he combination o
0d20: 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54  f JT_LEFT and JT
0d30: 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  _RIGHT..**.** If
0d40: 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75   an illegal or u
0d50: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
0d60: 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68  type is seen, th
0d70: 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a  en still return.
0d80: 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20  ** a join type, 
0d90: 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72  but put an error
0da0: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
0db0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
0dc0: 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65   sqlite3JoinType
0dd0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0de0: 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e  Token *pA, Token
0df0: 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29   *pB, Token *pC)
0e00: 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65  {.  int jointype
0e10: 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61   = 0;.  Token *a
0e20: 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e  pAll[3];.  Token
0e30: 20 2a 70 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   *p;.  static co
0e40: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
0e50: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79   const char zKey
0e60: 77 6f 72 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20  word[8];.    u8 
0e70: 6e 43 68 61 72 3b 0a 20 20 20 20 75 38 20 63 6f  nChar;.    u8 co
0e80: 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73  de;.  } keywords
0e90: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61  [] = {.    { "na
0ea0: 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41  tural", 7, JT_NA
0eb0: 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22  TURAL },.    { "
0ec0: 6c 65 66 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f  left",    4, JT_
0ed0: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  LEFT|JT_OUTER },
0ee0: 0a 20 20 20 20 7b 20 22 72 69 67 68 74 22 2c 20  .    { "right", 
0ef0: 20 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54    5, JT_RIGHT|JT
0f00: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0f10: 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54  "full",    4, JT
0f20: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a  _LEFT|JT_RIGHT|J
0f30: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0f40: 20 22 6f 75 74 65 72 22 2c 20 20 20 35 2c 20 4a   "outer",   5, J
0f50: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0f60: 20 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a   "inner",   5, J
0f70: 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b  T_INNER },.    {
0f80: 20 22 63 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a   "cross",   5, J
0f90: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53  T_INNER|JT_CROSS
0fa0: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
0fb0: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
0fc0: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
0fd0: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
0fe0: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
0ff0: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
1000: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
1010: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
1020: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f  for(j=0; j<sizeo
1030: 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65  f(keywords)/size
1040: 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b  of(keywords[0]);
1050: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1060: 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b   p->n==keywords[
1070: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
1080: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
1090: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
10a0: 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >z, keywords[j].
10b0: 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d  zKeyword, p->n)=
10c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f  =0 ){.        jo
10d0: 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72  intype |= keywor
10e0: 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20  ds[j].code;.    
10f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1100: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1110: 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f   j>=sizeof(keywo
1120: 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77  rds)/sizeof(keyw
1130: 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ords[0]) ){.    
1140: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54    jointype |= JT
1150: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
1160: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1170: 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74   if(.     (joint
1180: 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c  ype & (JT_INNER|
1190: 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f  JT_OUTER))==(JT_
11a0: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20  INNER|JT_OUTER) 
11b0: 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  ||.     (jointyp
11c0: 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30  e & JT_ERROR)!=0
11d0: 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  .  ){.    const 
11e0: 63 68 61 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b  char *zSp = " ";
11f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 21  .    assert( pB!
1200: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  =0 );.    if( pC
1210: 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a  ==0 ){ zSp++; }.
1220: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1230: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
1240: 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72  nown or unsuppor
1250: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22  ted join type: "
1260: 0a 20 20 20 20 20 20 20 22 25 54 20 25 54 25 73  .       "%T %T%s
1270: 25 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70  %T", pA, pB, zSp
1280: 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  , pC);.    joint
1290: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
12a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e    }else if( join
12b0: 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54 20  type & JT_RIGHT 
12c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
12d0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
12e0: 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64        "RIGHT and
12f0: 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e   FULL OUTER JOIN
1300: 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e  s are not curren
1310: 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b  tly supported");
1320: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
1330: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20  JT_INNER;.  }.  
1340: 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b  return jointype;
1350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1360: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1370: 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c  column in a tabl
1380: 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
1390: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   the column.** i
13a0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
13b0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
13c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75  .static int colu
13d0: 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  mnIndex(Table *p
13e0: 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Tab, const char 
13f0: 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  *zCol){.  int i;
1400: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1410: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
1420: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1430: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
1440: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  l[i].zName, zCol
1450: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1460: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1470: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1480: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74 6f  he value of a to
1490: 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27 2d  ken to a '\000'-
14a0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
14b0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
14c0: 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65 6e  d setToken(Token
14d0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
14e0: 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28 75  *z){.  p->z = (u
14f0: 38 2a 29 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20 7a  8*)z;.  p->n = z
1500: 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30   ? strlen(z) : 0
1510: 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a  ;.  p->dyn = 0;.
1520: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1530: 20 74 6f 6b 65 6e 20 74 6f 20 74 68 65 20 64 6f   token to the do
1540: 75 62 6c 65 2d 71 75 6f 74 65 64 20 61 6e 64 20  uble-quoted and 
1550: 65 73 63 61 70 65 64 20 76 65 72 73 69 6f 6e 20  escaped version 
1560: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 70 6f  of the string po
1570: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
1580: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3b 0a 2a  . For example;.*
1590: 2a 0a 2a 2a 20 20 20 20 7b 61 22 62 63 7d 20 20  *.**    {a"bc}  
15a0: 2d 3e 20 20 7b 22 61 22 22 62 63 22 7d 0a 2a 2f  ->  {"a""bc"}.*/
15b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
15c0: 51 75 6f 74 65 64 54 6f 6b 65 6e 28 50 61 72 73  QuotedToken(Pars
15d0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
15e0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
15f0: 2a 7a 29 7b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  *z){..  /* Check
1600: 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20 63   if the string c
1610: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 22 20 63 68  ontains any " ch
1620: 61 72 61 63 74 65 72 73 2e 20 49 66 20 69 74 20  aracters. If it 
1630: 64 6f 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  does, then.  ** 
1640: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
1650: 6c 6c 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20  ll malloc space 
1660: 74 6f 20 63 72 65 61 74 65 20 61 20 71 75 6f 74  to create a quot
1670: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 0a 20 20  ed version of.  
1680: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 6e  ** the string in
1690: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 61 76  . Otherwise, sav
16a0: 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  e a call to sqli
16b0: 74 65 33 4d 50 72 69 6e 74 66 28 29 20 62 79 0a  te3MPrintf() by.
16c0: 20 20 2a 2a 20 6a 75 73 74 20 63 6f 70 79 69 6e    ** just copyin
16d0: 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f  g the pointer to
16e0: 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 20 20 2a   the string..  *
16f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1700: 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28  z2 = z;.  while(
1710: 20 2a 7a 32 20 29 7b 0a 20 20 20 20 69 66 28 20   *z2 ){.    if( 
1720: 2a 7a 32 3d 3d 27 22 27 20 29 20 62 72 65 61 6b  *z2=='"' ) break
1730: 3b 0a 20 20 20 20 7a 32 2b 2b 3b 0a 20 20 7d 0a  ;.    z2++;.  }.
1740: 0a 20 20 69 66 28 20 2a 7a 32 20 29 7b 0a 20 20  .  if( *z2 ){.  
1750: 20 20 2f 2a 20 53 74 72 69 6e 67 20 63 6f 6e 74    /* String cont
1760: 61 69 6e 73 20 22 20 63 68 61 72 61 63 74 65 72  ains " character
1770: 73 20 2d 20 63 6f 70 79 20 61 6e 64 20 71 75 6f  s - copy and quo
1780: 74 65 20 74 68 65 20 73 74 72 69 6e 67 2e 20 2a  te the string. *
1790: 2f 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 28 75 38  /.    p->z = (u8
17a0: 20 2a 29 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   *)sqlite3MPrint
17b0: 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 5c  f(pParse->db, "\
17c0: 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20 20 20 20  "%w\"", z);.    
17d0: 69 66 28 20 70 2d 3e 7a 20 29 7b 0a 20 20 20 20  if( p->z ){.    
17e0: 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28    p->n = strlen(
17f0: 28 63 68 61 72 20 2a 29 70 2d 3e 7a 29 3b 0a 20  (char *)p->z);. 
1800: 20 20 20 20 20 70 2d 3e 64 79 6e 20 3d 20 31 3b       p->dyn = 1;
1810: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1820: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 63 6f      /* String co
1830: 6e 74 61 69 6e 73 20 6e 6f 20 22 20 63 68 61 72  ntains no " char
1840: 61 63 74 65 72 73 20 2d 20 63 6f 70 79 20 74 68  acters - copy th
1850: 65 20 70 6f 69 6e 74 65 72 2e 20 2a 2f 0a 20 20  e pointer. */.  
1860: 20 20 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a 3b    p->z = (u8*)z;
1870: 0a 20 20 20 20 70 2d 3e 6e 20 3d 20 28 7a 32 20  .    p->n = (z2 
1880: 2d 20 7a 29 3b 0a 20 20 20 20 70 2d 3e 64 79 6e  - z);.    p->dyn
1890: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
18a0: 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 65 78 70  ** Create an exp
18b0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
18c0: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 77   an identifier w
18d0: 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ith the name of 
18e0: 7a 4e 61 6d 65 0a 2a 2f 0a 45 78 70 72 20 2a 73  zName.*/.Expr *s
18f0: 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78  qlite3CreateIdEx
1900: 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pr(Parse *pParse
1910: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1920: 61 6d 65 29 7b 0a 20 20 54 6f 6b 65 6e 20 64 75  ame){.  Token du
1930: 6d 6d 79 3b 0a 20 20 73 65 74 54 6f 6b 65 6e 28  mmy;.  setToken(
1940: 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d 65 29 3b 0a  &dummy, zName);.
1950: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1960: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
1970: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64 75 6d 6d  _ID, 0, 0, &dumm
1980: 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  y);.}../*.** Add
1990: 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 57   a term to the W
19a0: 48 45 52 45 20 65 78 70 72 65 73 73 69 6f 6e 20  HERE expression 
19b0: 69 6e 20 2a 70 70 45 78 70 72 20 74 68 61 74 20  in *ppExpr that 
19c0: 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20  requires the.** 
19d0: 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  zCol column to b
19e0: 65 20 65 71 75 61 6c 20 69 6e 20 74 68 65 20 74  e equal in the t
19f0: 77 6f 20 74 61 62 6c 65 73 20 70 54 61 62 31 20  wo tables pTab1 
1a00: 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f 0a 73 74  and pTab2..*/.st
1a10: 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65  atic void addWhe
1a20: 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  reTerm(.  Parse 
1a30: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
1a40: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1a50: 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntext */.  const
1a60: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20   char *zCol,    
1a70: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1a80: 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  he column */.  c
1a90: 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54 61 62  onst Table *pTab
1aa0: 31 2c 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  1,      /* First
1ab0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73   table */.  cons
1ac0: 74 20 63 68 61 72 20 2a 7a 41 6c 69 61 73 31 2c  t char *zAlias1,
1ad0: 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f       /* Alias fo
1ae0: 72 20 66 69 72 73 74 20 74 61 62 6c 65 2e 20 20  r first table.  
1af0: 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1b00: 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70 54   const Table *pT
1b10: 61 62 32 2c 20 20 20 20 20 20 2f 2a 20 53 65 63  ab2,      /* Sec
1b20: 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  ond table */.  c
1b30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61  onst char *zAlia
1b40: 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73  s2,     /* Alias
1b50: 20 66 6f 72 20 73 65 63 6f 6e 64 20 74 61 62 6c   for second tabl
1b60: 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
1b70: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 4a  */.  int iRightJ
1b80: 6f 69 6e 54 61 62 6c 65 2c 20 20 20 20 20 2f 2a  oinTable,     /*
1b90: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
1ba0: 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
1bb0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45   */.  Expr **ppE
1bc0: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  xpr,           /
1bd0: 2a 20 41 64 64 20 74 68 65 20 65 71 75 61 6c 69  * Add the equali
1be0: 74 79 20 74 65 72 6d 20 74 6f 20 74 68 69 73 20  ty term to this 
1bf0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1c00: 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20  int isOuterJoin 
1c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c20: 20 69 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68   if dealing with
1c30: 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a   an OUTER join *
1c40: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 31  /.){.  Expr *pE1
1c50: 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45 31 63 3b  a, *pE1b, *pE1c;
1c60: 0a 20 20 45 78 70 72 20 2a 70 45 32 61 2c 20 2a  .  Expr *pE2a, *
1c70: 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a 20 20 45  pE2b, *pE2c;.  E
1c80: 78 70 72 20 2a 70 45 3b 0a 0a 20 20 70 45 31 61  xpr *pE;..  pE1a
1c90: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
1ca0: 49 64 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a  IdExpr(pParse, z
1cb0: 43 6f 6c 29 3b 0a 20 20 70 45 32 61 20 3d 20 73  Col);.  pE2a = s
1cc0: 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78  qlite3CreateIdEx
1cd0: 70 72 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 29  pr(pParse, zCol)
1ce0: 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61 73 31 3d  ;.  if( zAlias1=
1cf0: 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c 69 61 73  =0 ){.    zAlias
1d00: 31 20 3d 20 70 54 61 62 31 2d 3e 7a 4e 61 6d 65  1 = pTab1->zName
1d10: 3b 0a 20 20 7d 0a 20 20 70 45 31 62 20 3d 20 73  ;.  }.  pE1b = s
1d20: 71 6c 69 74 65 33 43 72 65 61 74 65 49 64 45 78  qlite3CreateIdEx
1d30: 70 72 28 70 50 61 72 73 65 2c 20 7a 41 6c 69 61  pr(pParse, zAlia
1d40: 73 31 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61  s1);.  if( zAlia
1d50: 73 32 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c  s2==0 ){.    zAl
1d60: 69 61 73 32 20 3d 20 70 54 61 62 32 2d 3e 7a 4e  ias2 = pTab2->zN
1d70: 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 32 62 20  ame;.  }.  pE2b 
1d80: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  = sqlite3CreateI
1d90: 64 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a 41  dExpr(pParse, zA
1da0: 6c 69 61 73 32 29 3b 0a 20 20 70 45 31 63 20 3d  lias2);.  pE1c =
1db0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1dc0: 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45  arse, TK_DOT, pE
1dd0: 31 62 2c 20 70 45 31 61 2c 20 30 29 3b 0a 20 20  1b, pE1a, 0);.  
1de0: 70 45 32 63 20 3d 20 73 71 6c 69 74 65 33 50 45  pE2c = sqlite3PE
1df0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
1e00: 4f 54 2c 20 70 45 32 62 2c 20 70 45 32 61 2c 20  OT, pE2b, pE2a, 
1e10: 30 29 3b 0a 20 20 70 45 20 3d 20 73 71 6c 69 74  0);.  pE = sqlit
1e20: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
1e30: 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20 70 45 32  TK_EQ, pE1c, pE2
1e40: 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 45 20  c, 0);.  if( pE 
1e50: 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29  && isOuterJoin )
1e60: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
1e70: 70 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f  perty(pE, EP_Fro
1e80: 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 45 2d 3e  mJoin);.    pE->
1e90: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1ea0: 3d 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  = iRightJoinTabl
1eb0: 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 45 78 70 72  e;.  }.  *ppExpr
1ec0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
1ed0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 2a 70 70  d(pParse->db,*pp
1ee0: 45 78 70 72 2c 20 70 45 29 3b 0a 7d 0a 0a 2f 2a  Expr, pE);.}../*
1ef0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46  .** Set the EP_F
1f00: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
1f10: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   on all terms of
1f20: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
1f30: 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65  ssion..** And se
1f40: 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68  t the Expr.iRigh
1f50: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54  tJoinTable to iT
1f60: 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74  able for every t
1f70: 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78  erm in the.** ex
1f80: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
1f90: 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  The EP_FromJoin 
1fa0: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
1fb0: 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20   on terms of an 
1fc0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65  expression to te
1fd0: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f  ll.** the LEFT O
1fe0: 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73  UTER JOIN proces
1ff0: 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20  sing logic that 
2000: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
2010: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e  t of the.** join
2020: 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65   restriction spe
2030: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e  cified in the ON
2040: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2050: 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a   and not a part.
2060: 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67  ** of the more g
2070: 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61  eneral WHERE cla
2080: 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d  use.  These term
2090: 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72  s are moved over
20a0: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
20b0: 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a   clause during j
20c0: 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62  oin processing b
20d0: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  ut we need to re
20e0: 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79  member that they
20f0: 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69  .** originated i
2100: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2110: 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  G clause..**.** 
2120: 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  The Expr.iRightJ
2130: 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74  oinTable tells t
2140: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2150: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20  processing that 
2160: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2170: 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62  n depends on tab
2180: 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  le iRightJoinTab
2190: 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  le even if that 
21a0: 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20  table is not.** 
21b0: 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69  explicitly menti
21c0: 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72  oned in the expr
21d0: 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e  ession.  That in
21e0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65  formation is nee
21f0: 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73  ded.** for cases
2200: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
2210: 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
2220: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
2230: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20  t2 ON t1.a=t2.b 
2240: 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a  AND t1.x=5.**.**
2250: 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   The where claus
2260: 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72  e needs to defer
2270: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
2280: 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74   the t1.x=5.** t
2290: 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20  erm until after 
22a0: 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74  the t2 loop of t
22b0: 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61  he join.  In tha
22c0: 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c  t way, a.** NULL
22d0: 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20   t2 row will be 
22e0: 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65  inserted wheneve
22f0: 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77  r t1.x!=5.  If w
2300: 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65  e do not.** defe
2310: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2320: 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c  f t1.x=5, it wil
2330: 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69  l be processed i
2340: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66  mmediately.** af
2350: 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ter the t1 loop 
2360: 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31  and rows with t1
2370: 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72  .x!=5 will never
2380: 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68   appear in.** th
2390: 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20  e output, which 
23a0: 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f  is incorrect..*/
23b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
23c0: 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70  JoinExpr(Expr *p
23d0: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
23e0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
23f0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
2400: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
2410: 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a  ;.    p->iRightJ
2420: 6f 69 6e 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  oinTable = iTabl
2430: 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78  e;.    setJoinEx
2440: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
2450: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
2460: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
2470: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2480: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
2490: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
24a0: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
24b0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
24c0: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
24d0: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
24e0: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
24f0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
2500: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
2510: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
2520: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
2530: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
2540: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
2550: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
2560: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
2570: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
2580: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
2590: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
25a0: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
25b0: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
25c0: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
25d0: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
25e0: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
25f0: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
2600: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
2610: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
2620: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
2630: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
2640: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
2650: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
2660: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
2670: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
2680: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
2690: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
26a0: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
26b0: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
26c0: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
26d0: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
26e0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
26f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
2700: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
2710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2720: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
2730: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
2740: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
2750: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2770: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
2780: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2790: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
27c0: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
27d0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
27e0: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
27f0: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
2800: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
2810: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2820: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
2830: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
2840: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
2850: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
2860: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
2870: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
2880: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
2890: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
28a0: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
28b0: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
28c0: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
28d0: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
28e0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
28f0: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
2900: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
2910: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
2920: 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70  pLeftTab==0 || p
2930: 52 69 67 68 74 54 61 62 3d 3d 30 20 29 20 63 6f  RightTab==0 ) co
2940: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75  ntinue;.    isOu
2950: 74 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 6a  ter = (pRight->j
2960: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
2970: 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20  ER)!=0;..    /* 
2980: 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c  When the NATURAL
2990: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
29a0: 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63  ent, add WHERE c
29b0: 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a  lause terms for.
29c0: 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c      ** every col
29d0: 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f  umn that the two
29e0: 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20   tables have in 
29f0: 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  common..    */. 
2a00: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a     if( pRight->j
2a10: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
2a20: 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  URAL ){.      if
2a30: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c  ( pRight->pOn ||
2a40: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
2a50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2a60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2a70: 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f  e, "a NATURAL jo
2a80: 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  in may not have 
2a90: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e  ".           "an
2aa0: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2ab0: 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  use", 0);.      
2ac0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2ad0: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
2ae0: 30 3b 20 6a 3c 70 4c 65 66 74 54 61 62 2d 3e 6e  0; j<pLeftTab->n
2af0: 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
2b00: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
2b10: 20 70 4c 65 66 74 54 61 62 2d 3e 61 43 6f 6c 5b   pLeftTab->aCol[
2b20: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
2b30: 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49 6e 64 65    if( columnInde
2b40: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
2b50: 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)>=0 ){.      
2b60: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
2b70: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20  (pParse, zName, 
2b80: 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d  pLeftTab, pLeft-
2b90: 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20  >zAlias, .      
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 54 61          pRightTa
2bc0: 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61  b, pRight->zAlia
2bd0: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
2c00: 2c 20 26 70 2d 3e 70 57 68 65 72 65 2c 20 69 73  , &p->pWhere, is
2c10: 4f 75 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Outer);.        
2c20: 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20    .        }.   
2c30: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2c40: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
2c50: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2c60: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
2c70: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
2c80: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2c90: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
2ca0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
2cb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2cc0: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
2cd0: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
2ce0: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
2cf0: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
2d00: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
2d10: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
2d20: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
2d30: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
2d40: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
2d50: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
2d60: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
2d70: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
2d80: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2d90: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
2da0: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
2db0: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
2dc0: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
2dd0: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
2de0: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
2df0: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
2e00: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
2e10: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
2e20: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
2e30: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
2e40: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
2e50: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
2e60: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
2e70: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
2e80: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
2e90: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
2ea0: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
2eb0: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
2ec0: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
2ed0: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
2ee0: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
2ef0: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
2f00: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
2f10: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
2f20: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
2f30: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
2f40: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
2f50: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
2f60: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
2f70: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
2f80: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
2f90: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
2fa0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
2fb0: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
2fc0: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
2fd0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
2fe0: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
2ff0: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3000: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3010: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3020: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3030: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
3040: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74  r *zName = pList
3050: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
3060: 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e        if( column
3070: 49 6e 64 65 78 28 70 4c 65 66 74 54 61 62 2c 20  Index(pLeftTab, 
3080: 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20 63 6f 6c 75  zName)<0 || colu
3090: 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61  mnIndex(pRightTa
30a0: 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 29 7b 0a 20  b, zName)<0 ){. 
30b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
30d0: 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73   "cannot join us
30e0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20  ing column %s - 
30f0: 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20  column ".       
3100: 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e       "not presen
3110: 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  t in both tables
3120: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
3130: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3140: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3150: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50   addWhereTerm(pP
3160: 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20 70 4c 65  arse, zName, pLe
3170: 66 74 54 61 62 2c 20 70 4c 65 66 74 2d 3e 7a 41  ftTab, pLeft->zA
3180: 6c 69 61 73 2c 20 0a 20 20 20 20 20 20 20 20 20  lias, .         
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 20 20 70 52 69 67 68 74 54 61 62 2c 20 70 52     pRightTab, pR
31b0: 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20  ight->zAlias,.  
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
31e0: 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70  ->iCursor, &p->p
31f0: 57 68 65 72 65 2c 20 69 73 4f 75 74 65 72 29 3b  Where, isOuter);
3200: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3210: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
3220: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 63  ../*.** Insert c
3230: 6f 64 65 20 69 6e 74 6f 20 22 76 22 20 74 68 61  ode into "v" tha
3240: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
3250: 72 65 63 6f 72 64 20 6f 6e 20 74 68 65 20 74 6f  record on the to
3260: 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73 74 61 63  p of the.** stac
3270: 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  k into the sorte
3280: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
3290: 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  d pushOntoSorter
32a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
32b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
32c0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
32d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
32e0: 65 72 42 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  erBy,    /* The 
32f0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
3300: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
3310: 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  lect,       /* T
3320: 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20  he whole SELECT 
3330: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
3340: 6e 74 20 72 65 67 44 61 74 61 20 20 20 20 20 20  nt regData      
3350: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
3360: 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 74  r holding data t
3370: 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 29  o be sorted */.)
3380: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
3390: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
33a0: 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f 72 64 65  nt nExpr = pOrde
33b0: 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 6e  rBy->nExpr;.  in
33c0: 74 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69  t regBase = sqli
33d0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
33e0: 70 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 32 29  pParse, nExpr+2)
33f0: 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  ;.  int regRecor
3400: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
3410: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
3420: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
3430: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
3440: 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61   pOrderBy, regBa
3450: 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  se, 0);.  sqlite
3460: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3470: 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64  P_Sequence, pOrd
3480: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
3490: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a  regBase+nExpr);.
34a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
34b0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
34c0: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
34d0: 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71  Expr+1, 1);.  sq
34e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
34f0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
3500: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
3510: 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29   + 2, regRecord)
3520: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3530: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
3540: 6e 73 65 72 74 2c 20 70 4f 72 64 65 72 42 79 2d  nsert, pOrderBy-
3550: 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65  >iECursor, regRe
3560: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
3570: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
3580: 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
3590: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
35a0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
35b0: 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45  rse, regBase, nE
35c0: 78 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53  xpr+2);.  if( pS
35d0: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b  elect->iLimit ){
35e0: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20  .    int addr1, 
35f0: 61 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69  addr2;.    int i
3600: 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70  Limit;.    if( p
3610: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20  Select->iOffset 
3620: 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20  ){.      iLimit 
3630: 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  = pSelect->iOffs
3640: 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  et+1;.    }else{
3650: 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  .      iLimit = 
3660: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b  pSelect->iLimit;
3670: 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31  .    }.    addr1
3680: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
3690: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp1(v, OP_IfZer
36a0: 6f 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  o, iLimit);.    
36b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36c0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
36d0: 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20  iLimit, -1);.   
36e0: 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
36f0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
3700: 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69  _Goto);.    sqli
3710: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3720: 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
3730: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
3740: 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72  (v, OP_Last, pOr
3750: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29  derBy->iECursor)
3760: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3770: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
3780: 6c 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  lete, pOrderBy->
3790: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73  iECursor);.    s
37a0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
37b0: 72 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20  re(v, addr2);.  
37c0: 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69    pSelect->iLimi
37d0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 0;.  }.}../*
37e0: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20  .** Add code to 
37f0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46  implement the OF
3800: 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76  FSET.*/.static v
3810: 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a  oid codeOffset(.
3820: 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
3830: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
3840: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
3850: 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  M */.  Select *p
3860: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
3870: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3880: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
3890: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20    int iContinue 
38a0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
38b0: 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72   to skip the cur
38c0: 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29  rent record */.)
38d0: 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73  {.  if( p->iOffs
38e0: 65 74 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21  et && iContinue!
38f0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  =0 ){.    int ad
3900: 64 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  dr;.    sqlite3V
3910: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3920: 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f 66 66 73  AddImm, p->iOffs
3930: 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61 64 64  et, -1);.    add
3940: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
3950: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 65  ddOp1(v, OP_IfNe
3960: 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a  g, p->iOffset);.
3970: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3980: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
3990: 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  , 0, iContinue);
39a0: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
39b0: 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53 45  ((v, "skip OFFSE
39c0: 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20 20  T records"));.  
39d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
39e0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
39f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
3a00: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
3a10: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  check to make su
3a20: 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65  re the N registe
3a30: 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69  rs starting at i
3a40: 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69  Mem.** form a di
3a50: 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69  stinct entry.  i
3a60: 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67  Tab is a sorting
3a70: 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64   index that hold
3a80: 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
3a90: 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  seen combination
3aa0: 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65  s of the N value
3ab0: 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  s.  A new entry 
3ac0: 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a  is made in iTab.
3ad0: 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ** if the curren
3ae0: 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e  t N values are n
3af0: 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70  ew..**.** A jump
3b00: 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69   to addrRepeat i
3b10: 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e  s made and the N
3b20: 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f  +1 values are po
3b30: 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  pped from the.**
3b40: 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f   stack if the to
3b50: 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  p N elements are
3b60: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a   not distinct..*
3b70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
3b80: 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61  deDistinct(.  Pa
3b90: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
3ba0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
3bb0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
3bc0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
3bd0: 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20   iTab,          
3be0: 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64  /* A sorting ind
3bf0: 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  ex used to test 
3c00: 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73  for distinctness
3c10: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65   */.  int addrRe
3c20: 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70  peat,    /* Jump
3c30: 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20   to here if not 
3c40: 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e  distinct */.  in
3c50: 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
3c60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
3c70: 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ements */.  int 
3c80: 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f  iMem           /
3c90: 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  * First element 
3ca0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  */.){.  Vdbe *v;
3cb0: 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20  .  int r1;..  v 
3cc0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
3cd0: 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  .  r1 = sqlite3G
3ce0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
3cf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3d00: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
3d10: 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e  eRecord, iMem, N
3d20: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
3d30: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
3d40: 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64  _Found, iTab, ad
3d50: 64 72 52 65 70 65 61 74 2c 20 72 31 29 3b 0a 20  drRepeat, r1);. 
3d60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3d70: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
3d80: 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20  rt, iTab, r1);. 
3d90: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
3da0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
3db0: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  1);.}../*.** Gen
3dc0: 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  erate an error m
3dd0: 65 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45  essage when a SE
3de0: 4c 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74  LECT is used wit
3df0: 68 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73  hin a subexpress
3e00: 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a  ion.** (example:
3e10: 20 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20    "a IN (SELECT 
3e20: 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20  * FROM table)") 
3e30: 62 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20  but it has more 
3e40: 74 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a  than 1 result.**
3e50: 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20   column.  We do 
3e60: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
3e70: 74 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65  tine because the
3e80: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
3e90: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 70 6c 61   multiple.** pla
3ea0: 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ces..*/.static i
3eb0: 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69  nt checkForMulti
3ec0: 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f  ColumnSelectErro
3ed0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
3ee0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
3ef0: 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20  se context. */. 
3f00: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
3f10: 73 74 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  st,   /* Destina
3f20: 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72  tion of SELECT r
3f30: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
3f40: 6e 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  nExpr           
3f50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
3f60: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74  sult columns ret
3f70: 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20  urned by SELECT 
3f80: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73  */.){.  int eDes
3f90: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
3fa0: 3b 0a 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20  ;.  if( nExpr>1 
3fb0: 26 26 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d  && (eDest==SRT_M
3fc0: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
3fd0: 5f 53 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  _Set) ){.    sql
3fe0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3ff0: 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e  rse, "only a sin
4000: 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
4010: 65 64 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20  ed for ".       
4020: 22 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  "a SELECT that i
4030: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
4040: 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72  ression");.    r
4050: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65  eturn 1;.  }else
4060: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4070: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
4080: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
4090: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
40a0: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
40b0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
40c0: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
40d0: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e  .** If srcTab an
40e0: 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f  d nColumn are bo
40f0: 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  th zero, then th
4100: 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  e pEList express
4110: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
4120: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
4130: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
4140: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
4150: 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68   nColumn>0.** th
4160: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
4170: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
4180: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
4190: 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65   only to get the
41a0: 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f  .** datatypes fo
41b0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
41c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
41d0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
41e0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
41f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4200: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
4210: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
4220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4230: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
4240: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
4250: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
4260: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
4270: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
4280: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
4290: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
42a0: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
42b0: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
42c0: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
42d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
42e0: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
42f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
4300: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
4310: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
4320: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
4330: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
4340: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
4350: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
4360: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e   */.  int distin
4370: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
4380: 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65 20 73 75   If >=0, make su
4390: 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  re results are d
43a0: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 53 65 6c  istinct */.  Sel
43b0: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
43c0: 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
43d0: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65  ispose of the re
43e0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
43f0: 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20  Continue,       
4400: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
4410: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  to continue with
4420: 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69   next row */.  i
4430: 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
4440: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
4450: 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
4460: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
4470: 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  op */.){.  Vdbe 
4480: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4490: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
44a0: 6e 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20  nt hasDistinct; 
44b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
44c0: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
44d0: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
44e0: 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  t */.  int regRe
44f0: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
4500: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d     /* Start of m
4510: 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65  emory holding re
4520: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  sult set */.  in
4530: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
4540: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
4550: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
4560: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
4570: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
4580: 50 61 72 6d 3b 20 20 20 2f 2a 20 46 69 72 73 74  Parm;   /* First
4590: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
45a0: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
45b0: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
45c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
45d0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
45e0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20  t columns */..  
45f0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
4600: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  n;.  assert( pEL
4610: 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44  ist!=0 );.  hasD
4620: 69 73 74 69 6e 63 74 20 3d 20 64 69 73 74 69 6e  istinct = distin
4630: 63 74 3e 3d 30 3b 0a 20 20 69 66 28 20 70 4f 72  ct>=0;.  if( pOr
4640: 64 65 72 42 79 3d 3d 30 20 26 26 20 21 68 61 73  derBy==0 && !has
4650: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
4660: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
4670: 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d   iContinue);.  }
4680: 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
4690: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
46a0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 43  s..  */.  if( nC
46b0: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 6e  olumn>0 ){.    n
46c0: 52 65 73 75 6c 74 43 6f 6c 20 3d 20 6e 43 6f 6c  ResultCol = nCol
46d0: 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  umn;.  }else{.  
46e0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70    nResultCol = p
46f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
4700: 7d 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  }.  if( pDest->i
4710: 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  Mem==0 ){.    pD
4720: 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  est->iMem = pPar
4730: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
4740: 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 6e 52  pDest->nMem = nR
4750: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 70 50  esultCol;.    pP
4760: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
4770: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73  esultCol;.  }els
4780: 65 20 69 66 28 20 70 44 65 73 74 2d 3e 6e 4d 65  e if( pDest->nMe
4790: 6d 21 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 7b  m!=nResultCol ){
47a0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
47b0: 70 65 6e 73 20 77 68 65 6e 20 74 77 6f 20 53 45  pens when two SE
47c0: 4c 45 43 54 73 20 6f 66 20 61 20 63 6f 6d 70 6f  LECTs of a compo
47d0: 75 6e 64 20 53 45 4c 45 43 54 20 68 61 76 65 20  und SELECT have 
47e0: 64 69 66 66 65 72 69 6e 67 0a 20 20 20 20 2a 2a  differing.    **
47f0: 20 6e 75 6d 62 65 72 73 20 6f 66 20 72 65 73 75   numbers of resu
4800: 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 20 54 68 65  lt columns.  The
4810: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
4820: 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
4830: 20 62 79 0a 20 20 20 20 2a 2a 20 61 20 68 69 67   by.    ** a hig
4840: 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her-level routin
4850: 65 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  e. */.    return
4860: 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 73 75 6c  ;.  }.  regResul
4870: 74 20 3d 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3b  t = pDest->iMem;
4880: 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30  .  if( nColumn>0
4890: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
48a0: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
48b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
48c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
48d0: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
48e0: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
48f0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
4900: 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78  f( eDest!=SRT_Ex
4910: 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ists ){.    /* I
4920: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
4930: 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e  n is an EXISTS(.
4940: 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ..) expression, 
4950: 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a  the actual.    *
4960: 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  * values returne
4970: 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
4980: 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64  are not required
4990: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
49a0: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
49b0: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
49c0: 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ist, regResult, 
49d0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
49e0: 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c  ack);.  }.  nCol
49f0: 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  umn = nResultCol
4a00: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  ;..  /* If the D
4a10: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
4a20: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
4a30: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
4a40: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
4a50: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
4a60: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
4a70: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
4a80: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
4a90: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
4aa0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
4ab0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73 73  tinct ){.    ass
4ac0: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
4ad0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
4ae0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43 6f  List->nExpr==nCo
4af0: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64 65  lumn );.    code
4b00: 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
4b10: 20 64 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e 74   distinct, iCont
4b20: 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  inue, nColumn, r
4b30: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 69  egResult);.    i
4b40: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
4b50: 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73  {.      codeOffs
4b60: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
4b70: 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ue);.    }.  }..
4b80: 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75    if( checkForMu
4b90: 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
4ba0: 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65  rror(pParse, pDe
4bb0: 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st, pEList->nExp
4bc0: 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
4bd0: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
4be0: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a   eDest ){.    /*
4bf0: 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77   In this mode, w
4c00: 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20  rite each query 
4c10: 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65  result to the ke
4c20: 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  y of the tempora
4c30: 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ry.    ** table 
4c40: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69  iParm..    */.#i
4c50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4c60: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
4c70: 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  T.    case SRT_U
4c80: 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  nion: {.      in
4c90: 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d  t r1;.      r1 =
4ca0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
4cb0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
4cc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
4cd0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
4ce0: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
4cf0: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20   nColumn, r1);. 
4d00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4d10: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
4d20: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
4d30: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
4d40: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
4d50: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
4d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4d70: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63  .    /* Construc
4d80: 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  t a record from 
4d90: 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
4da0: 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66  , but instead of
4db0: 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74  .    ** saving t
4dc0: 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20  hat record, use 
4dd0: 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64  it as a key to d
4de0: 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66  elete elements f
4df0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74  rom.    ** the t
4e00: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
4e10: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Parm..    */.   
4e20: 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74   case SRT_Except
4e30: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4e40: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4e50: 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61  P_IdxDelete, iPa
4e60: 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rm, regResult, n
4e70: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
4e80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
4e90: 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  if..    /* Store
4ea0: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
4eb0: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
4ec0: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
4ed0: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
4ee0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
4ef0: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
4f00: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
4f10: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
4f20: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
4f30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4f40: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
4f50: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
4f60: 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 69  mn, r1);.      i
4f70: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
4f80: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
4f90: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
4fa0: 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a  rderBy, p, r1);.
4fb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4fc0: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
4fd0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
4fe0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
4ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5000: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
5010: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
5020: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5030: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
5040: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
5050: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
5060: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5070: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
5080: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
5090: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
50a0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
50b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
50c0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
50d0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
50e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
50f0: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
5100: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
5110: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
5120: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
5130: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
5140: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
5150: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
5160: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
5170: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
5180: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
5190: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
51a0: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
51b0: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
51c0: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
51d0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
51e0: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
51f0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
5200: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==1 );.      p->
5210: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
5220: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
5230: 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  y(pEList->a[0].p
5240: 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66  Expr, pDest->aff
5250: 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 69 66  inity);.      if
5260: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
5270: 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73        /* At firs
5280: 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75  t glance you wou
5290: 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c  ld think we coul
52a0: 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74  d optimize out t
52b0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52  he.        ** OR
52c0: 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63  DER BY in this c
52d0: 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ase since the or
52e0: 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  der of entries i
52f0: 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  n the set.      
5300: 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61    ** does not ma
5310: 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65  tter.  But there
5320: 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49   might be a LIMI
5330: 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69  T clause, in whi
5340: 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ch.        ** ca
5350: 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  se the order doe
5360: 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20  s matter */.    
5370: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
5380: 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  er(pParse, pOrde
5390: 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c  rBy, p, regResul
53a0: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
53b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
53c0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
53d0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
53e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
53f0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
5400: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
5410: 6c 74 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e 61  lt, 1, r1, &p->a
5420: 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
5430: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
5440: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
5450: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
5460: 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20  esult, 1);.     
5470: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5480: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
5490: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29  sert, iParm, r1)
54a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
54b0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
54c0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
54d0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
54e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
54f0: 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
5500: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
5510: 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
5520: 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
5530: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5540: 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
5550: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5560: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
5570: 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a  ger, 1, iParm);.
5580: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
5590: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
55a0: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
55b0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
55c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
55d0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
55e0: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
55f0: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
5600: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
5610: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
5620: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
5630: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
5640: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
5650: 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
5660: 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
5670: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
5680: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
5690: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
56a0: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
56b0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
56c0: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
56d0: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
56e0: 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65   pOrderBy, p, re
56f0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
5700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5710: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
5720: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ve(pParse, regRe
5730: 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b  sult, iParm, 1);
5740: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
5750: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
5760: 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
5770: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
5780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5790: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
57a0: 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
57b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
57c0: 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  RY */..    /* Se
57d0: 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  nd the data to t
57e0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  he callback func
57f0: 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62  tion or to a sub
5800: 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65  routine.  In the
5810: 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20  .    ** case of 
5820: 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68  a subroutine, th
5830: 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73  e subroutine its
5840: 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62  elf is responsib
5850: 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f  le for.    ** po
5860: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66  pping the data f
5870: 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20  rom the stack.. 
5880: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5890: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20  RT_Coroutine:.  
58a0: 20 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62    case SRT_Callb
58b0: 61 63 6b 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ack: {.      if(
58c0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
58d0: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
58e0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
58f0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
5900: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5910: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
5920: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
5930: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
5940: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
5950: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
5960: 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20  derBy, p, r1);. 
5970: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
5980: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
5990: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
59a0: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
59b0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
59c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
59d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
59e0: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
59f0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  iParm);.      }e
5a00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5a10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5a20: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
5a30: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
5a40: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
5a50: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
5a60: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
5a70: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  se, regResult, n
5a80: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
5a90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5aa0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
5ab0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
5ac0: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
5ad0: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
5ae0: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
5af0: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
5b00: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
5b10: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
5b20: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
5b30: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
5b40: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
5b50: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
5b60: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
5b70: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
5b80: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
5b90: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
5ba0: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
5bb0: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
5bc0: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
5bd0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5be0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
5bf0: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
5c00: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5c10: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
5c20: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
5c30: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
5c40: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
5c50: 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
5c60: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
5c70: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
5c80: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 20 20  pOrderBy==0 );  
5c90: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
5ca0: 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  n ORDER BY, the 
5cb0: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20  call to.        
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 20 20 20 2a 2a 20 70 75 73 68 4f 6e 74 6f 53      ** pushOntoS
5ce0: 6f 72 74 65 72 28 29 20 77 6f 75 6c 64 20 68 61  orter() would ha
5cf0: 76 65 20 63 6c 65 61 72 65 64 20 70 2d 3e 69 4c  ve cleared p->iL
5d00: 69 6d 69 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  imit */.    sqli
5d10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5d20: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69   OP_AddImm, p->i
5d30: 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
5d40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5d50: 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20  2(v, OP_IfZero, 
5d60: 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
5d70: 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  k);.  }.}../*.**
5d80: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
5d90: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
5da0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
5db0: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
5dc0: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
5dd0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
5de0: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
5df0: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
5e00: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
5e10: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
5e20: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
5e30: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
5e40: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
5e50: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
5e60: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
5e70: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
5e80: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
5e90: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
5ea0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
5eb0: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
5ec0: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
5ed0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
5ee0: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
5ef0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
5f00: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
5f10: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
5f20: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
5f30: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
5f40: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
5f50: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
5f60: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
5f70: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
5f80: 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20   is obtain from 
5f90: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
5fa0: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
5fb0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
5fc0: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
5fd0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
5fe0: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
5ff0: 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20  freed.  Add the 
6000: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
6010: 65 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c  e to the P4 fiel
6020: 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75  d of an opcode u
6030: 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e  sing.** P4_KEYIN
6040: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68  FO_HANDOFF is th
6050: 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64  e usual way of d
6060: 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73  ealing with this
6070: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
6080: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
6090: 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a  ExprList(Parse *
60a0: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
60b0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pList){.  sqli
60c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
60d0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ->db;.  int nExp
60e0: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
60f0: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
6100: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
6110: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  em;.  int i;..  
6120: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
6130: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
6140: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
6150: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
6160: 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28  pInfo) + nExpr*(
6170: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
6180: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  +1) );.  if( pIn
6190: 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  fo ){.    pInfo-
61a0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
61b0: 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  8*)&pInfo->aColl
61c0: 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e  [nExpr];.    pIn
61d0: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78  fo->nField = nEx
61e0: 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65  pr;.    pInfo->e
61f0: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
6200: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
6210: 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78  =pList->a; i<nEx
6220: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
6230: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
6240: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70   *pColl;.      p
6250: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
6260: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
6270: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
6280: 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
6290: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
62a0: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
62b0: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
62c0: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69    pInfo->aColl[i
62d0: 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
62e0: 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64   pInfo->aSortOrd
62f0: 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73  er[i] = pItem->s
6300: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
6310: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e    }.  return pIn
6320: 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  fo;.}.../*.** If
6330: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
6340: 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73  was generated us
6350: 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70  ing a non-null p
6360: 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74  OrderBy argument
6370: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65  ,.** then the re
6380: 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65  sults were place
6390: 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20  d in a sorter.  
63a0: 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69  After the loop i
63b0: 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  s terminated.** 
63c0: 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74  we need to run t
63d0: 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75  he sorter and ou
63e0: 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73  tput the results
63f0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
6400: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
6410: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e  rates the code n
6420: 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74  eeded to do that
6430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6440: 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69   generateSortTai
6450: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  l(.  Parse *pPar
6460: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
6470: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
6480: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
6490: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
64a0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64  tatement */.  Vd
64b0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
64c0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
64d0: 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20   into this VDBE 
64e0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  */.  int nColumn
64f0: 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ,      /* Number
6500: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64   of columns of d
6510: 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
6520: 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72  est *pDest /* Wr
6530: 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72  ite the sorted r
6540: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
6550: 7b 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71  {.  int brk = sq
6560: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
6570: 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e  el(v);.  int con
6580: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
6590: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69  akeLabel(v);.  i
65a0: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69  nt addr;.  int i
65b0: 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64  Tab;.  int pseud
65c0: 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72  oTab = 0;.  Expr
65d0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
65e0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
65f0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
6600: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74  st->eDest;.  int
6610: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
6620: 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65  iParm;..  int re
6630: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
6640: 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20  owid;..  iTab = 
6650: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
6660: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
6670: 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 7c 7c  =SRT_Callback ||
6680: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
6690: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65  utine ){.    pse
66a0: 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d  udoTab = pParse-
66b0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
66c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
66d0: 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d  , OP_SetNumColum
66e0: 6e 73 2c 20 30 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  ns, 0, nColumn);
66f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6700: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
6710: 6e 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54  nPseudo, pseudoT
6720: 61 62 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  ab, eDest==SRT_C
6730: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 20 20  allback);.  }.  
6740: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
6750: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6760: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 62  OP_Sort, iTab, b
6770: 72 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  rk);.  codeOffse
6780: 74 28 76 2c 20 70 2c 20 63 6f 6e 74 29 3b 0a 20  t(v, p, cont);. 
6790: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
67a0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
67b0: 73 65 29 3b 0a 20 20 72 65 67 52 6f 77 69 64 20  se);.  regRowid 
67c0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
67d0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
67e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
67f0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
6800: 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  Tab, pOrderBy->n
6810: 45 78 70 72 20 2b 20 31 2c 20 72 65 67 52 6f 77  Expr + 1, regRow
6820: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  );.  switch( eDe
6830: 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
6840: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
6850: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
6860: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6870: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6880: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
6890: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
68a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
68b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
68c0: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
68d0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
68e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
68f0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
6900: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
6910: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
6920: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6930: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
6940: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
6950: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
6960: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
6970: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6980: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
6990: 72 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72  rd, regRow, 1, r
69a0: 65 67 52 6f 77 69 64 2c 20 26 70 2d 3e 61 66 66  egRowid, &p->aff
69b0: 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20  inity, 1);.     
69c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
69d0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
69e0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
69f0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
6a00: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6a10: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
6a20: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
6a30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6a40: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  }.    case SRT_M
6a50: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  em: {.      asse
6a60: 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29  rt( nColumn==1 )
6a70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
6a80: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
6a90: 73 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72  se, regRow, iPar
6aa0: 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20  m, 1);.      /* 
6ab0: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
6ac0: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
6ad0: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
6ae0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
6af0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
6b00: 20 63 61 73 65 20 53 52 54 5f 43 61 6c 6c 62 61   case SRT_Callba
6b10: 63 6b 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  ck:.    case SRT
6b20: 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  _Coroutine: {.  
6b30: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
6b40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b50: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
6b60: 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  , 1, regRowid);.
6b70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6b80: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
6b90: 73 65 72 74 2c 20 70 73 65 75 64 6f 54 61 62 2c  sert, pseudoTab,
6ba0: 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69   regRow, regRowi
6bb0: 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  d);.      for(i=
6bc0: 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  0; i<nColumn; i+
6bd0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
6be0: 72 74 28 20 72 65 67 52 6f 77 21 3d 70 44 65 73  rt( regRow!=pDes
6bf0: 74 2d 3e 69 4d 65 6d 2b 69 20 29 3b 0a 20 20 20  t->iMem+i );.   
6c00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6c10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
6c20: 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  umn, pseudoTab, 
6c30: 69 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69  i, pDest->iMem+i
6c40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6c50: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
6c60: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
6c70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6c80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
6c90: 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 4d  ltRow, pDest->iM
6ca0: 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  em, nColumn);.  
6cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6cc0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
6cd0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65  ange(pParse, pDe
6ce0: 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75 6d  st->iMem, nColum
6cf0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
6d00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6d10: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
6d20: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
6d30: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Parm);.      }. 
6d40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6d50: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
6d60: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
6d70: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
6d80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
6d90: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
6da0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
6db0: 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65  egRow);.  sqlite
6dc0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
6dd0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
6de0: 29 3b 0a 0a 20 20 2f 2a 20 4c 49 4d 49 54 20 68  );..  /* LIMIT h
6df0: 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e  as been implemen
6e00: 74 65 64 20 62 79 20 74 68 65 20 70 75 73 68 4f  ted by the pushO
6e10: 6e 74 6f 53 6f 72 74 65 72 28 29 20 72 6f 75 74  ntoSorter() rout
6e20: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ine..  */.  asse
6e30: 72 74 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30  rt( p->iLimit==0
6e40: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f   );..  /* The bo
6e50: 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
6e60: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
6e70: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
6e80: 76 2c 20 63 6f 6e 74 29 3b 0a 20 20 73 71 6c 69  v, cont);.  sqli
6e90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6ea0: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
6eb0: 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  addr);.  sqlite3
6ec0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
6ed0: 28 76 2c 20 62 72 6b 29 3b 0a 20 20 69 66 28 20  (v, brk);.  if( 
6ee0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62  eDest==SRT_Callb
6ef0: 61 63 6b 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ack || eDest==SR
6f00: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
6f10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6f20: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
6f30: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b  , pseudoTab, 0);
6f40: 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  .  }..}../*.** R
6f50: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
6f60: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74  to a string cont
6f70: 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c  aining the 'decl
6f80: 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66  aration type' of
6f90: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
6fa0: 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20 73 74  on pExpr. The st
6fb0: 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61  ring may be trea
6fc0: 74 65 64 20 61 73 20 73 74 61 74 69 63 20 62 79  ted as static by
6fd0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
6fe0: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
6ff0: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
7000: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
7010: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
7020: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
7030: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
7040: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
7050: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
7060: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
7070: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
7080: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
7090: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
70a0: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
70b0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
70c0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
70d0: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
70e0: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
70f0: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
7100: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
7110: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
7120: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
7130: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
7140: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
7150: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
7160: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
7170: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
7180: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
7190: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
71a0: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
71b0: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
71c0: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
71d0: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
71e0: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
71f0: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
7200: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
7210: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
7220: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
7230: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
7240: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
7250: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  mn is NULL..*/.s
7260: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7270: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 28 0a 20 20   *columnType(.  
7280: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
7290: 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  , .  Expr *pExpr
72a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
72b0: 2a 70 7a 4f 72 69 67 69 6e 44 62 2c 0a 20 20 63  *pzOriginDb,.  c
72c0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
72d0: 69 67 69 6e 54 61 62 2c 0a 20 20 63 6f 6e 73 74  iginTab,.  const
72e0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
72f0: 43 6f 6c 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  Col.){.  char co
7300: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
7310: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
7320: 72 69 67 69 6e 44 62 20 3d 20 30 3b 0a 20 20 63  riginDb = 0;.  c
7330: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
7340: 69 6e 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61  inTab = 0;.  cha
7350: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e  r const *zOrigin
7360: 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  Col = 0;.  int j
7370: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
7380: 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73   || pNC->pSrcLis
7390: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
73a0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
73b0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
73c0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
73d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
73e0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
73f0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
7400: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
7410: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
7420: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
7430: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
7440: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
7450: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
7460: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
7470: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
7480: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
7490: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
74a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
74b0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
74c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
74d0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
74e0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
74f0: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
7500: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
7510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7520: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
7530: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
7540: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
7550: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
7560: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
7570: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
7580: 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  ab */.      whil
7590: 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20  e( pNC && !pTab 
75a0: 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69  ){.        SrcLi
75b0: 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
75c0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
75d0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c        for(j=0;j<
75e0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
75f0: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
7600: 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d  .iCursor!=pExpr-
7610: 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20  >iTable;j++);.  
7620: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62        if( j<pTab
7630: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  List->nSrc ){.  
7640: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
7650: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
7660: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ab;.          pS
7670: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
7680: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ].pSelect;.     
7690: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
76a0: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
76b0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
76c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
76d0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
76e0: 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a        /* FIX ME:
76f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
7700: 20 63 61 6e 20 6f 63 63 75 72 73 20 69 66 20 79   can occurs if y
7710: 6f 75 20 68 61 76 65 20 73 6f 6d 65 74 68 69 6e  ou have somethin
7720: 67 20 6c 69 6b 65 20 22 53 45 4c 45 43 54 20 6e  g like "SELECT n
7730: 65 77 2e 78 3b 22 20 69 6e 73 69 64 65 0a 20 20  ew.x;" inside.  
7740: 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
7750: 65 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  er.  In other wo
7760: 72 64 73 2c 20 69 66 20 79 6f 75 20 72 65 66 65  rds, if you refe
7770: 72 65 6e 63 65 20 74 68 65 20 73 70 65 63 69 61  rence the specia
7780: 6c 20 22 6e 65 77 22 0a 20 20 20 20 20 20 20 20  l "new".        
7790: 2a 2a 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ** table in the 
77a0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
77b0: 73 65 6c 65 63 74 2e 20 20 57 65 20 64 6f 20 6e  select.  We do n
77c0: 6f 74 20 68 61 76 65 20 61 20 67 6f 6f 64 20 77  ot have a good w
77d0: 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ay.        ** to
77e0: 20 66 69 6e 64 20 74 68 65 20 61 63 74 75 61 6c   find the actual
77f0: 20 74 61 62 6c 65 20 74 79 70 65 2c 20 73 6f 20   table type, so 
7800: 63 61 6c 6c 20 69 74 20 22 54 45 58 54 22 2e 20  call it "TEXT". 
7810: 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 0a   This is really.
7820: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 6d 65 74          ** somet
7830: 68 69 6e 67 20 6f 66 20 61 20 62 75 67 2c 20 62  hing of a bug, b
7840: 75 74 20 49 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  ut I do not know
7850: 20 68 6f 77 20 74 6f 20 66 69 78 20 69 74 2e 0a   how to fix it..
7860: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
7870: 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
7880: 64 6f 65 73 20 6e 6f 74 20 70 72 6f 64 75 63 65  does not produce
7890: 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
78a0: 77 65 72 20 2d 20 69 74 20 6a 75 73 74 20 70 72  wer - it just pr
78b0: 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a  events.        *
78c0: 2a 20 61 20 73 65 67 66 61 75 6c 74 2e 20 20 53  * a segfault.  S
78d0: 65 65 20 74 69 63 6b 65 74 20 23 31 32 32 39 2e  ee ticket #1229.
78e0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
78f0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 54 45 58      zType = "TEX
7900: 54 22 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  T";.        brea
7910: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
7920: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 29    assert( pTab )
7930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29  ;.      if( pS )
7940: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
7950: 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75   "table" is actu
7960: 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63  ally a sub-selec
7970: 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74  t or a view in t
7980: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
7990: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
79a0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
79b0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
79c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
79d0: 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20  nd origin.      
79e0: 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68    ** data for th
79f0: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  e result-set col
7a00: 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73  umn of the sub-s
7a10: 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  elect..        *
7a20: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  /.        if( iC
7a30: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53  ol>=0 && iCol<pS
7a40: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
7a50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
7a60: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
7a70: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
7a80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
7a90: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
7aa0: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
7ab0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
7ac0: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
7ad0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
7ae0: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
7af0: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
7b00: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
7b10: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
7b20: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
7b30: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
7b40: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
7b50: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
7b60: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
7b70: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
7b80: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
7b90: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
7ba0: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
7bb0: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  C.pNext = 0;.   
7bc0: 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73         sNC.pPars
7bd0: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
7be0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
7bf0: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
7c00: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44  NC, p, &zOriginD
7c10: 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20  b, &zOriginTab, 
7c20: 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20  &zOriginCol); . 
7c30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7c40: 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70  else if( pTab->p
7c50: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
7c60: 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c    /* A real tabl
7c70: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
7c80: 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20  ert( !pS );.    
7c90: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
7ca0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
7cb0: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Key;.        ass
7cc0: 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c  ert( iCol==-1 ||
7cd0: 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f   (iCol>=0 && iCo
7ce0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b  l<pTab->nCol) );
7cf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
7d00: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<0 ){.         
7d10: 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45   zType = "INTEGE
7d20: 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  R";.          zO
7d30: 72 69 67 69 6e 43 6f 6c 20 3d 20 22 72 6f 77 69  riginCol = "rowi
7d40: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
7d50: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e{.          zTy
7d60: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
7d70: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
7d80: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f         zOriginCo
7d90: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
7da0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
7db0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f      }.        zO
7dc0: 72 69 67 69 6e 54 61 62 20 3d 20 70 54 61 62 2d  riginTab = pTab-
7dd0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
7de0: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
7df0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
7e00: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
7e10: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
7e20: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
7e30: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
7e40: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 44 62         zOriginDb
7e50: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
7e60: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
7e70: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  me;.        }.  
7e80: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7e90: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
7ea0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
7eb0: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
7ec0: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
7ed0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
7ee0: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
7ef0: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
7f00: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
7f10: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
7f20: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
7f30: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
7f40: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7f50: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
7f60: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
7f70: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
7f80: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
7f90: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
7fa0: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 70 53   *pS = pExpr->pS
7fb0: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70  elect;.      Exp
7fc0: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
7fd0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
7fe0: 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73       sNC.pSrcLis
7ff0: 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20  t = pS->pSrc;.  
8000: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
8010: 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  pNC;.      sNC.p
8020: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
8030: 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  rse;.      zType
8040: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
8050: 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 69 6e 44  NC, p, &zOriginD
8060: 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61 62 2c 20  b, &zOriginTab, 
8070: 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b 20 0a 20  &zOriginCol); . 
8080: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8090: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a  }.#endif.  }.  .
80a0: 20 20 69 66 28 20 70 7a 4f 72 69 67 69 6e 44 62    if( pzOriginDb
80b0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
80c0: 70 7a 4f 72 69 67 69 6e 54 61 62 20 26 26 20 70  pzOriginTab && p
80d0: 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b 0a 20 20  zOriginCol );.  
80e0: 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62 20 3d 20    *pzOriginDb = 
80f0: 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20 20 20 2a  zOriginDb;.    *
8100: 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 7a 4f  pzOriginTab = zO
8110: 72 69 67 69 6e 54 61 62 3b 0a 20 20 20 20 2a 70  riginTab;.    *p
8120: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 7a 4f 72  zOriginCol = zOr
8130: 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 72  iginCol;.  }.  r
8140: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
8150: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
8160: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
8170: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
8180: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
8190: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
81a0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
81b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
81c0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
81d0: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
81e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
81f0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
8200: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
8210: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
8220: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
8230: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
8240: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
8250: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
8260: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
8270: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8280: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
8290: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
82a0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
82b0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
82c0: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
82d0: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
82e0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
82f0: 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  arse;.  for(i=0;
8300: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
8310: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
8320: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
8330: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
8340: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
8350: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8360: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
8370: 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20  ADATA.    const 
8380: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
8390: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
83a0: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
83b0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
83c0: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
83d0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
83e0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
83f0: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
8400: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b 0a  ab, &zOrigCol);.
8410: 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65  .    /* The vdbe
8420: 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f   must make its o
8430: 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63  wn copy of the c
8440: 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f  olumn-type and o
8450: 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c  ther .    ** col
8460: 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72  umn specific str
8470: 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68  ings, in case th
8480: 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65  e schema is rese
8490: 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20  t before this.  
84a0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63    ** virtual mac
84b0: 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e  hine is deleted.
84c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
84d0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
84e0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
84f0: 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44  DATABASE, zOrigD
8500: 62 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29  b, P4_TRANSIENT)
8510: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8520: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8530: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
8540: 20 7a 4f 72 69 67 54 61 62 2c 20 50 34 5f 54 52   zOrigTab, P4_TR
8550: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
8560: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8570: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8580: 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43  E_COLUMN, zOrigC
8590: 6f 6c 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54  ol, P4_TRANSIENT
85a0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
85b0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
85c0: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
85d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
85e0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
85f0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8600: 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70  E_DECLTYPE, zTyp
8610: 65 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29  e, P4_TRANSIENT)
8620: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
8630: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
8640: 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  TYPE */.}../*.**
8650: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
8660: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
8670: 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73  e VDBE the names
8680: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
8690: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
86a0: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
86b0: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
86c0: 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a  rovide the.** az
86d0: 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20  Col[] values in 
86e0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  the callback..*/
86f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
8700: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
8710: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8720: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
8730: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
8740: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
8750: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
8760: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
8770: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
8780: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
8790: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
87a0: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
87b0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
87c0: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Vdbe;.  int i, j
87d0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
87e0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
87f0: 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73  int fullNames, s
8800: 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e  hortNames;..#ifn
8810: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8820: 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20  EXPLAIN.  /* If 
8830: 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41  this is an EXPLA
8840: 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74  IN, skip this st
8850: 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  ep */.  if( pPar
8860: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
8870: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
8880: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
8890: 20 76 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   v!=0 );.  if( p
88a0: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
88b0: 65 74 20 7c 7c 20 76 3d 3d 30 20 7c 7c 20 64 62  et || v==0 || db
88c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
88d0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73   return;.  pPars
88e0: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
88f0: 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20   1;.  fullNames 
8900: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
8910: 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
8920: 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e  es)!=0;.  shortN
8930: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
8940: 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
8950: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
8960: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
8970: 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d  mCols(v, pEList-
8980: 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69  >nExpr);.  for(i
8990: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
89a0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
89b0: 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20  xpr *p;.    p = 
89c0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
89d0: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  pr;.    if( p==0
89e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
89f0: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
8a00: 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ].zName ){.     
8a10: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
8a20: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
8a30: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
8a40: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8a50: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
8a60: 45 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e  E, zName, strlen
8a70: 28 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 65  (zName));.    }e
8a80: 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  lse if( p->op==T
8a90: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62  K_COLUMN && pTab
8aa0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61  List ){.      Ta
8ab0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
8ac0: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
8ad0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
8ae0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
8af0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 4c  for(j=0; j<pTabL
8b00: 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61  ist->nSrc && pTa
8b10: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
8b20: 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65 3b 20  sor!=p->iTable; 
8b30: 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73  j++){}.      ass
8b40: 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d  ert( j<pTabList-
8b50: 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70  >nSrc );.      p
8b60: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
8b70: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
8b80: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
8b90: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
8ba0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8bb0: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
8bc0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
8bd0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
8be0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
8bf0: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
8c00: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
8c10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
8c20: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
8c30: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
8c40: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73    }.      if( !s
8c50: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75  hortNames && !fu
8c60: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
8c70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8c80: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8c90: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28 63 68  OLNAME_NAME, (ch
8ca0: 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70  ar*)p->span.z, p
8cb0: 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20 20  ->span.n);.     
8cc0: 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e   }else if( fullN
8cd0: 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f 72 74 4e  ames || (!shortN
8ce0: 61 6d 65 73 20 26 26 20 70 54 61 62 4c 69 73 74  ames && pTabList
8cf0: 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a 20 20 20  ->nSrc>1) ){.   
8d00: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
8d10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
8d20: 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20 20 20 20  ar *zTab;. .    
8d30: 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c      zTab = pTabL
8d40: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c 69 61 73  ist->a[j].zAlias
8d50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 75  ;.        if( fu
8d60: 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54 61 62 3d  llNames || zTab=
8d70: 3d 30 20 29 20 7a 54 61 62 20 3d 20 70 54 61 62  =0 ) zTab = pTab
8d80: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
8d90: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
8da0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
8db0: 25 73 22 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29  %s", zTab, zCol)
8dc0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8dd0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8de0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8df0: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59  ME, zName, P4_DY
8e00: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  NAMIC);.      }e
8e10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
8e20: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8e30: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8e40: 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 73 74 72  _NAME, zCol, str
8e50: 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20 20 20 20  len(zCol));.    
8e60: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
8e70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8e80: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8e90: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 28   COLNAME_NAME, (
8ea0: 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c  char*)p->span.z,
8eb0: 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20   p->span.n);.   
8ec0: 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74   }.  }.  generat
8ed0: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61  eColumnTypes(pPa
8ee0: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
8ef0: 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64  EList);.}..#ifnd
8f00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
8f10: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
8f20: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
8f30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
8f40: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
8f50: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
8f60: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
8f70: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
8f80: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
8f90: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
8fa0: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
8fb0: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
8fc0: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
8fd0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8fe0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
8ff0: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
9000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9010: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
9020: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
9030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
9040: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
9050: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
9060: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
9070: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64  return z;.}.#end
9080: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
9090: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
90a0: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  T */../*.** Forw
90b0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
90c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
90d0: 65 70 53 65 6c 65 63 74 53 74 6d 74 28 50 61 72  epSelectStmt(Par
90e0: 73 65 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 0a  se*, Select*);..
90f0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45  /*.** Given a SE
9100: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
9110: 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65  generate a Table
9120: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
9130: 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65  describes.** the
9140: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
9150: 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54  hat SELECT..*/.T
9160: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73  able *sqlite3Res
9170: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50  ultSetOfSelect(P
9180: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68  arse *pParse, ch
9190: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 2c 20 53 65  ar *zTabName, Se
91a0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
91b0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
91c0: 20 69 6e 74 20 69 2c 20 6a 2c 20 72 63 3b 0a 20   int i, j, rc;. 
91d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
91e0: 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  t;.  Column *aCo
91f0: 6c 2c 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  l, *pCol;.  sqli
9200: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9210: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65  ->db;.  int save
9220: 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64  dFlags;..  saved
9230: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
9240: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  s;.  db->flags &
9250: 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
9260: 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c  lNames;.  db->fl
9270: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
9280: 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 72  ortColNames;.  r
9290: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
92a0: 74 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c  tResolve(pParse,
92b0: 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20   pSelect, 0);.  
92c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
92d0: 4b 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  K ){.    while( 
92e0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
92f0: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
9300: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  ect->pPrior;.   
9310: 20 72 63 20 3d 20 70 72 65 70 53 65 6c 65 63 74   rc = prepSelect
9320: 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 53 65  Stmt(pParse, pSe
9330: 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72  lect);.    if( r
9340: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9350: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9360: 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
9370: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
9380: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
9390: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76   db->flags = sav
93a0: 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 72  edFlags;.  if( r
93b0: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
93c0: 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  0;.  }.  pTab = 
93d0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
93e0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
93f0: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
9400: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
9410: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
9420: 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70  ab->db = db;.  p
9430: 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
9440: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pTab->zName = z
9450: 54 61 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65  TabName ? sqlite
9460: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 54  3DbStrDup(db, zT
9470: 61 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 70  abName) : 0;.  p
9480: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
9490: 3e 70 45 4c 69 73 74 3b 0a 20 20 70 54 61 62 2d  >pEList;.  pTab-
94a0: 3e 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e  >nCol = pEList->
94b0: 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  nExpr;.  assert(
94c0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b   pTab->nCol>0 );
94d0: 0a 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  .  pTab->aCol = 
94e0: 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  aCol = sqlite3Db
94f0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
9500: 69 7a 65 6f 66 28 70 54 61 62 2d 3e 61 43 6f 6c  izeof(pTab->aCol
9510: 5b 30 5d 29 2a 70 54 61 62 2d 3e 6e 43 6f 6c 29  [0])*pTab->nCol)
9520: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 61 43  ;.  testcase( aC
9530: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69  ol==0 );.  for(i
9540: 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
9550: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
9560: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 45  , pCol++){.    E
9570: 78 70 72 20 2a 70 3b 0a 20 20 20 20 63 68 61 72  xpr *p;.    char
9580: 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 63 68 61   *zType;.    cha
9590: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  r *zName;.    in
95a0: 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c  t nName;.    Col
95b0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
95c0: 20 69 6e 74 20 63 6e 74 3b 0a 20 20 20 20 4e 61   int cnt;.    Na
95d0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
95e0: 20 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 61     .    /* Get a
95f0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
9600: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
9610: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
9620: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
9630: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
9640: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c   p->pRight==0 ||
9650: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
9660: 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  n.z==0 || p->pRi
9670: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21  ght->token.z[0]!
9680: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  =0 );.    if( (z
9690: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
96a0: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
96b0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
96c0: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
96d0: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
96e0: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
96f0: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
9700: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
9710: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9720: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
9730: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 3d  }else if( p->op=
9740: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
9750: 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 2f  >pTab ){.      /
9760: 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73  * For columns us
9770: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
9780: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
9790: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
97a0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28  olumn;.      if(
97b0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
97c0: 20 70 2d 3e 70 54 61 62 2d 3e 69 50 4b 65 79 3b   p->pTab->iPKey;
97d0: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
97e0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
97f0: 2c 20 22 25 73 22 2c 20 70 2d 3e 70 54 61 62 2d  , "%s", p->pTab-
9800: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
9810: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9820: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
9830: 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
9840: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72   the column expr
9850: 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61  ession as its na
9860: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d  me */.      zNam
9870: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
9880: 74 66 28 64 62 2c 20 22 25 54 22 2c 20 26 70 2d  tf(db, "%T", &p-
9890: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  >span);.    }.  
98a0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
98b0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
98c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
98d0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
98e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
98f0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
9900: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
9910: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f  Make sure the co
9920: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69  lumn name is uni
9930: 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  que.  If the nam
9940: 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c  e is not unique,
9950: 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61  .    ** append a
9960: 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
9970: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
9980: 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
9990: 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65      */.    nName
99a0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
99b0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d  ;.    for(j=cnt=
99c0: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
99d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
99e0: 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a  trICmp(aCol[j].z
99f0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
9a00: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
9a10: 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20  *zNewName;.     
9a20: 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20     zName[nName] 
9a30: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65  = 0;.        zNe
9a40: 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  wName = sqlite3M
9a50: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 3a 25  Printf(db, "%s:%
9a60: 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74  d", zName, ++cnt
9a70: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9a80: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
9a90: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  me);.        zNa
9aa0: 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20  me = zNewName;. 
9ab0: 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20         j = -1;. 
9ac0: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
9ad0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
9ae0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
9af0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  Col->zName = zNa
9b00: 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20  me;..    /* Get 
9b10: 74 68 65 20 74 79 70 65 6e 61 6d 65 2c 20 74 79  the typename, ty
9b20: 70 65 20 61 66 66 69 6e 69 74 79 2c 20 61 6e 64  pe affinity, and
9b30: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
9b40: 6e 63 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20  nce for the.    
9b50: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a  ** column..    *
9b60: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
9b70: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
9b80: 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  ));.    sNC.pSrc
9b90: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
9ba0: 70 53 72 63 3b 0a 20 20 20 20 7a 54 79 70 65 20  pSrc;.    zType 
9bb0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
9bc0: 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65  p(db, columnType
9bd0: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
9be0: 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a  0));.    pCol->z
9bf0: 54 79 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20  Type = zType;.  
9c00: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
9c10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
9c20: 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 70  finity(p);.    p
9c30: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
9c40: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
9c50: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
9c60: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
9c70: 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
9c80: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
9c90: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
9ca0: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
9cb0: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
9cc0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
9cd0: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
9ce0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 54 61  3DeleteTable(pTa
9cf0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  b);.    return 0
9d00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9d10: 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  Tab;.}../*.** Pr
9d20: 65 70 61 72 65 20 61 20 53 45 4c 45 43 54 20 73  epare a SELECT s
9d30: 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
9d40: 63 65 73 73 69 6e 67 20 62 79 20 64 6f 69 6e 67  cessing by doing
9d50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
9d60: 2a 20 74 68 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20  * things:.**.** 
9d70: 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72     (1)  Make sur
9d80: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
9d90: 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
9da0: 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72  assigned to ever
9db0: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65  y.**         ele
9dc0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  ment of the FROM
9dd0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
9de0: 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74    (2)  Fill in t
9df0: 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  he pTabList->a[]
9e00: 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20  .pTab fields in 
9e10: 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
9e20: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66   .**         def
9e30: 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  ines FROM clause
9e40: 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70  .  When views ap
9e50: 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
9e60: 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20   clause,.**     
9e70: 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73      fill pTabLis
9e80: 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77  t->a[].pSelect w
9e90: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
9ea0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
9eb0: 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  nt.**         th
9ec0: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
9ed0: 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20  e view.  A copy 
9ee0: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76  is made of the v
9ef0: 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20  iew's SELECT.** 
9f00: 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
9f10: 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  t so that we can
9f20: 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f   freely modify o
9f30: 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74  r delete that st
9f40: 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
9f50: 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79     without worry
9f60: 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e  ing about messin
9f70: 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74  g up the presist
9f80: 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ent representati
9f90: 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66  on.**         of
9fa0: 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a   the view..**.**
9fb0: 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72      (3)  Add ter
9fc0: 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  ms to the WHERE 
9fd0: 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f  clause to accomo
9fe0: 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c  date the NATURAL
9ff0: 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20   keyword.**     
a000: 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64      on joins and
a010: 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
a020: 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e  G clause of join
a030: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20  s..**.**    (4) 
a040: 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f   Scan the list o
a050: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
a060: 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c   result set (pEL
a070: 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20  ist) looking.** 
a080: 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74          for inst
a090: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22  ances of the "*"
a0a0: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65   operator or the
a0b0: 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f   TABLE.* operato
a0c0: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66  r..**         If
a0d0: 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65   found, expand e
a0e0: 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76  ach "*" to be ev
a0f0: 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76  ery column in ev
a100: 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20  ery table.**    
a110: 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a       and TABLE.*
a120: 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
a130: 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a  umn in TABLE..**
a140: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20  .** Return 0 on 
a150: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
a160: 72 65 20 61 72 65 20 70 72 6f 62 6c 65 6d 73 2c  re are problems,
a170: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
a180: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
a190: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
a1a0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
a1b0: 74 69 63 20 69 6e 74 20 70 72 65 70 53 65 6c 65  tic int prepSele
a1c0: 63 74 53 74 6d 74 28 50 61 72 73 65 20 2a 70 50  ctStmt(Parse *pP
a1d0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
a1e0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c  {.  int i, j, k,
a1f0: 20 72 63 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a   rc;.  SrcList *
a200: 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
a210: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
a220: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
a230: 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
a240: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a250: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
a260: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 53 72 63 3d 3d  ==0 || p->pSrc==
a270: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
a280: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
a290: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 1;.  }.  pTa
a2a0: 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
a2b0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
a2c0: 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  EList;..  /* Mak
a2d0: 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
a2e0: 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
a2f0: 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
a300: 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
a310: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
a320: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
a330: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
a340: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
a350: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
a360: 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 0a 20  se, p->pSrc);.. 
a370: 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
a380: 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
a390: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
a3a0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
a3b0: 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
a3c0: 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
a3d0: 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
a3e0: 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
a3f0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
a400: 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
a410: 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
a420: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
a430: 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
a440: 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
a450: 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
a460: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
a470: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
a480: 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
a490: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69  ble *pTab;.    i
a4a0: 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
a4b0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
a4c0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
a4d0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
a4e0: 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
a4f0: 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
a500: 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
a510: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
a520: 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( i==0 );.     
a530: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
a540: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
a550: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
a560: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a570: 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 2f  SUBQUERY.      /
a580: 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
a590: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
a5a0: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
a5b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
a5c0: 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20  rom->pSelect!=0 
a5d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  );.      if( pFr
a5e0: 6f 6d 2d 3e 7a 41 6c 69 61 73 3d 3d 30 20 29 7b  om->zAlias==0 ){
a5f0: 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
a600: 7a 41 6c 69 61 73 20 3d 0a 20 20 20 20 20 20 20  zAlias =.       
a610: 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
a620: 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 75  f(db, "sqlite_su
a630: 62 71 75 65 72 79 5f 25 70 5f 22 2c 20 28 76 6f  bquery_%p_", (vo
a640: 69 64 2a 29 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  id*)pFrom->pSele
a650: 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
a660: 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
a670: 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
a680: 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
a690: 20 70 54 61 62 20 3d 20 0a 20 20 20 20 20 20 20   pTab = .       
a6a0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
a6b0: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
a6c0: 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 2c  , pFrom->zAlias,
a6d0: 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
a6e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
a6f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
a700: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
a710: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 73  .      /* The is
a720: 45 70 68 65 6d 20 66 6c 61 67 20 69 6e 64 69 63  Ephem flag indic
a730: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 54 61  ates that the Ta
a740: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 61  ble structure ha
a750: 73 20 62 65 65 6e 0a 20 20 20 20 20 20 2a 2a 20  s been.      ** 
a760: 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
a770: 63 61 74 65 64 20 61 6e 64 20 6d 61 79 20 62 65  cated and may be
a780: 20 66 72 65 65 64 20 61 74 20 61 6e 79 20 74 69   freed at any ti
a790: 6d 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  me.  In other wo
a7a0: 72 64 73 2c 0a 20 20 20 20 20 20 2a 2a 20 70 54  rds,.      ** pT
a7b0: 61 62 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  ab is not pointi
a7c0: 6e 67 20 74 6f 20 61 20 70 65 72 73 69 73 74 65  ng to a persiste
a7d0: 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
a7e0: 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 0a  re that defines.
a7f0: 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66        ** part of
a800: 20 74 68 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a   the schema. */.
a810: 20 20 20 20 20 20 70 54 61 62 2d 3e 69 73 45 70        pTab->isEp
a820: 68 65 6d 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  hem = 1;.#endif.
a830: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a840: 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
a850: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
a860: 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
a870: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
a880: 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
a890: 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
a8a0: 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
a8b0: 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71 6c  b = .        sql
a8c0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
a8d0: 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e  pParse,0,pFrom->
a8e0: 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61  zName,pFrom->zDa
a8f0: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 69  tabase);.      i
a900: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
a910: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
a920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
a930: 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20  ab->nRef++;.#if 
a940: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a950: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
a960: 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
a970: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
a980: 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ).      if( pTab
a990: 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56  ->pSelect || IsV
a9a0: 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
a9b0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
a9c0: 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
a9d0: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
a9e0: 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
a9f0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
aa00: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
aa10: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
aa20: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
aa30: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
aa40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
aa50: 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  * If pFrom->pSel
aa60: 65 63 74 21 3d 30 20 69 74 20 6d 65 61 6e 73 20  ect!=0 it means 
aa70: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
aa80: 69 74 68 20 61 0a 20 20 20 20 20 20 20 20 2a 2a  ith a.        **
aa90: 20 76 69 65 77 20 77 69 74 68 69 6e 20 61 20 76   view within a v
aaa0: 69 65 77 2e 20 20 54 68 65 20 53 45 4c 45 43 54  iew.  The SELECT
aab0: 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 61   structure has a
aac0: 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20  lready been.    
aad0: 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 62 79      ** copied by
aae0: 20 74 68 65 20 6f 75 74 65 72 20 76 69 65 77 20   the outer view 
aaf0: 73 6f 20 77 65 20 63 61 6e 20 73 6b 69 70 20 74  so we can skip t
ab00: 68 65 20 63 6f 70 79 20 73 74 65 70 20 68 65 72  he copy step her
ab10: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  e.        ** in 
ab20: 74 68 65 20 69 6e 6e 65 72 20 76 69 65 77 2e 0a  the inner view..
ab30: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
ab40: 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 53     if( pFrom->pS
ab50: 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
ab60: 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
ab70: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
ab80: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
ab90: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
aba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
abb0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
abc0: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
abd0: 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
abe0: 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
abf0: 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
ac00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
ac10: 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
ac20: 50 61 72 73 65 2c 20 70 29 20 29 20 72 65 74 75  Parse, p) ) retu
ac30: 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  rn 1;..  /* For 
ac40: 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
ac50: 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
ac60: 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
ac70: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
ac80: 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
ac90: 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
aca0: 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
acb0: 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
acc0: 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
acd0: 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
ace0: 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
acf0: 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
ad00: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
ad10: 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
ad20: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  LL operator for 
ad30: 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
ad40: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
ad50: 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20  lumn list..  ** 
ad60: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
ad70: 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
ad80: 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c  ocate the TK_ALL
ad90: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
ada0: 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63   expand.  ** eac
adb0: 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
adc0: 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
add0: 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   in all tables..
ade0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
adf0: 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
ae00: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
ae10: 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
ae20: 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
ae30: 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
ae40: 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
ae50: 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
ae60: 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
ae70: 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69 73  Expr *pE = pELis
ae80: 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
ae90: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
aea0: 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
aeb0: 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
aec0: 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
aed0: 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67 68  ght && pE->pRigh
aee0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20 20  t->op==TK_ALL.  
aef0: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70 4c         && pE->pL
af00: 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  eft && pE->pLeft
af10: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62 72  ->op==TK_ID ) br
af20: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  eak;.  }.  rc = 
af30: 30 3b 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73  0;.  if( k<pELis
af40: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
af50: 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
af60: 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
af70: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
af80: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
af90: 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
afa0: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
afb0: 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
afc0: 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
afd0: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
afe0: 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
aff0: 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
b000: 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
b010: 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
b020: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
b030: 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
b040: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
b050: 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
b060: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
b070: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
b080: 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
b090: 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
b0a0: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
b0b0: 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20  mes)!=0.        
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
b0d0: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
b0e0: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
b0f0: 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30  =0;..    for(k=0
b100: 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
b110: 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; k++){.      E
b120: 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70  xpr *pE = a[k].p
b130: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
b140: 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  pE->op!=TK_ALL &
b150: 26 0a 20 20 20 20 20 20 20 20 20 20 20 28 70 45  &.           (pE
b160: 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
b170: 70 45 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c  pE->pRight==0 ||
b180: 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21   pE->pRight->op!
b190: 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20  =TK_ALL) ){.    
b1a0: 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74      /* This part
b1b0: 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f  icular expressio
b1c0: 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
b1d0: 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a  to be expanded..
b1e0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
b1f0: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
b200: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
b210: 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b  pParse, pNew, a[
b220: 6b 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  k].pExpr, 0);.  
b230: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
b240: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
b250: 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
b260: 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
b270: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
b280: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b290: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
b2a0: 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70  }.        a[k].p
b2b0: 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
b2c0: 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
b2d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b2e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
b2f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
b300: 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
b310: 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
b320: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
b330: 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
b340: 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
b350: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
b360: 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
b370: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
b380: 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
b390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b3a0: 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
b3b0: 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
b3c0: 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
b3d0: 44 4f 54 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  DOT && pE->pLeft
b3e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
b3f0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
b400: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
b410: 26 70 45 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  &pE->pLeft->toke
b420: 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
b430: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  e{.          zTN
b440: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
b450: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
b460: 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
b470: 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
b480: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
b490: 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
b4a0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
b4b0: 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
b4c0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
b4d0: 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
b4e0: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
b4f0: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
b500: 20 7c 7c 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d   || zTabName[0]=
b510: 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  =0 ){ .         
b520: 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
b530: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
b540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b550: 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d   assert( zTabNam
b560: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  e );.          i
b570: 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c  f( zTName && sql
b580: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
b590: 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
b5a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b5b0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
b5c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b5d0: 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20  tableSeen = 1;. 
b5e0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
b5f0: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
b600: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
b610: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a    Expr *pExpr, *
b620: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
b630: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
b640: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
b650: 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20  zName;..        
b660: 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75      /* If a colu
b670: 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  mn is marked as 
b680: 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e  'hidden' (curren
b690: 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c  tly only possibl
b6a0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
b6b0: 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   for virtual tab
b6c0: 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63  les), do not inc
b6d0: 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 65  lude it in the e
b6e0: 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20  xpanded.        
b6f0: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65      ** result-se
b700: 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20  t list..        
b710: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
b720: 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43     if( IsHiddenC
b730: 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
b740: 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  l[j]) ){.       
b750: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49 73         assert(Is
b760: 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a  Virtual(pTab));.
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
b780: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
b790: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
b7a0: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
b7c0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
b7d0: 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69  *pLeft = &pTabLi
b7e0: 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20  st->a[i-1];.    
b7f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
b800: 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65  Left[1].jointype
b810: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
b820: 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
b840: 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  umnIndex(pLeft->
b850: 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  pTab, zName)>=0 
b860: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
b870: 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
b880: 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
b890: 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
b8a0: 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
b8b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
b8c0: 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  e on the right *
b8d0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
b8e0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
b8f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b900: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
b910: 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
b920: 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67  (pLeft[1].pUsing
b930: 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b950: 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
b960: 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
b970: 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
b980: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
b990: 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
b9a0: 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
b9b0: 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
b9c0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
b9d0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
b9f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
ba00: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
ba10: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
ba20: 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c  Parse, TK_ID, 0,
ba30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
ba40: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d      if( pRight==
ba50: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
ba60: 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65 64         setQuoted
ba70: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70  Token(pParse, &p
ba80: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e  Right->token, zN
ba90: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
baa0: 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
bab0: 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  || pTabList->nSr
bac0: 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
bad0: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
bae0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
baf0: 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30  pParse, TK_ID, 0
bb00: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
bb10: 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
bb20: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
bb30: 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
bb40: 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
bb60: 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61   pExpr==0 ) brea
bb70: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
bb80: 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28   setQuotedToken(
bb90: 70 50 61 72 73 65 2c 20 26 70 4c 65 66 74 2d 3e  pParse, &pLeft->
bba0: 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29  token, zTabName)
bbb0: 3b 0a 23 69 66 20 31 0a 20 20 20 20 20 20 20 20  ;.#if 1.        
bbc0: 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26        setToken(&
bbd0: 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20  pExpr->span, .  
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
bc00: 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
bc10: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20  Name, zName));. 
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
bc30: 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31  pr->span.dyn = 1
bc40: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
bc50: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
bc60: 6e 20 3d 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65  n = pRight->toke
bc70: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
bc80: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e   pExpr->span.dyn
bc90: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
bca0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
bcb0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20  ->token.z = 0;. 
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
bcd0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b  pr->token.n = 0;
bce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
bcf0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  Expr->token.dyn 
bd00: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
bd10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bd20: 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
bd30: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
bd40: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20      pExpr->span 
bd50: 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a  = pExpr->token;.
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
bd70: 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20  xpr->span.dyn = 
bd80: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
bd90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
bda0: 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20   longNames ){.  
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
bdc0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
bdd0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
bde0: 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70   pNew, pExpr, &p
bdf0: 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
be00: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
be20: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
be30: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
be40: 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  e, pNew, pExpr, 
be50: 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b  &pRight->token);
be60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
be70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
be80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
be90: 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
bea0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
beb0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
bec0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
bed0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
bee0: 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
bef0: 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
bf00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bf10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
bf20: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
bf30: 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
bf40: 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
bf50: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
bf60: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
bf70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
bf80: 72 65 65 28 64 62 2c 20 7a 54 4e 61 6d 65 29 3b  ree(db, zTName);
bf90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bfa0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
bfb0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c  stDelete(db, pEL
bfc0: 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
bfd0: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
bfe0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
bff0: 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70  OLUMN.  if( p->p
c000: 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69  EList && p->pELi
c010: 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  st->nExpr>db->aL
c020: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
c030: 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
c040: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c050: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
c060: 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  ny columns in re
c070: 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20 20  sult set");.    
c080: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
c090: 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  R;.  }.#endif.  
c0a0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
c0b0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  iled ){.    rc =
c0c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c0d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c0e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61  }../*.** pE is a
c0f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65   pointer to an e
c100: 78 70 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20  xpression which 
c110: 69 73 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  is a single term
c120: 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20   in.** ORDER BY 
c130: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
c140: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  se..**.** At the
c150: 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74   point this rout
c160: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77  ine is called, w
c170: 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74  e already know t
c180: 68 61 74 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  hat the.** ORDER
c190: 20 42 59 20 74 65 72 6d 20 69 73 20 6e 6f 74 20   BY term is not 
c1a0: 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 64 65 78  an integer index
c1b0: 20 69 6e 74 6f 20 74 68 65 20 72 65 73 75 6c 74   into the result
c1c0: 20 73 65 74 2e 20 20 54 68 61 74 0a 2a 2a 20 63   set.  That.** c
c1d0: 61 73 65 65 20 69 73 20 68 61 6e 64 6c 65 64 20  asee is handled 
c1e0: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  by the calling r
c1f0: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  outine..**.** If
c200: 20 70 45 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f   pE is a well-fo
c210: 72 6d 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20  rmed expression 
c220: 61 6e 64 20 74 68 65 20 53 45 4c 45 43 54 20 73  and the SELECT s
c230: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e  tatement.** is n
c240: 6f 74 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68 65  ot compound, the
c250: 6e 20 72 65 74 75 72 6e 20 30 2e 20 20 54 68 69  n return 0.  Thi
c260: 73 20 69 6e 64 69 63 61 74 65 73 20 74 6f 20 74  s indicates to t
c270: 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 68 61  he.** caller tha
c280: 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f 72 74  t it should sort
c290: 20 62 79 20 74 68 65 20 76 61 6c 75 65 20 6f 66   by the value of
c2a0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a   the ORDER BY.**
c2b0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
c2c0: 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
c2d0: 20 69 73 20 63 6f 6d 70 6f 75 6e 64 2c 20 74 68   is compound, th
c2e0: 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61  en attempt to ma
c2f0: 74 63 68 20 70 45 20 61 67 61 69 6e 73 74 0a 2a  tch pE against.*
c300: 2a 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  * result set col
c310: 75 6d 6e 73 20 69 6e 20 74 68 65 20 6c 65 66 74  umns in the left
c320: 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
c330: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a  tement.  Return.
c340: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 20 6f  ** the index i o
c350: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
c360: 6f 6c 75 6d 6e 2c 20 61 73 20 61 6e 20 69 6e 64  olumn, as an ind
c370: 69 63 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 0a  ication to the .
c380: 2a 2a 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69  ** caller that i
c390: 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62 79  t should sort by
c3a0: 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e   the i-th column
c3b0: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a  .  If there is.*
c3c0: 2a 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74 75  * no match, retu
c3d0: 72 6e 20 2d 31 20 61 6e 64 20 6c 65 61 76 65 20  rn -1 and leave 
c3e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
c3f0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73   in pParse..*/.s
c400: 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 4f  tatic int matchO
c410: 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72  rderByTermToExpr
c420: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
c430: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
c440: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f  rsing context fo
c450: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
c460: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
c470: 65 6c 65 63 74 2c 20 20 20 2f 2a 20 54 68 65 20  elect,   /* The 
c480: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c490: 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
c4a0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
c4b0: 78 70 72 20 2a 70 45 2c 20 20 20 20 20 20 20 20  xpr *pE,        
c4c0: 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69    /* The specifi
c4d0: 63 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  c ORDER BY term 
c4e0: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20  */.  int idx,   
c4f0: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20          /* When 
c500: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 73  ORDER BY term is
c510: 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 69   this */.  int i
c520: 73 43 6f 6d 70 6f 75 6e 64 2c 20 20 20 20 2f 2a  sCompound,    /*
c530: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
c540: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
c550: 43 54 20 2a 2f 0a 20 20 75 38 20 2a 70 48 61 73  CT */.  u8 *pHas
c560: 41 67 67 20 20 20 20 20 20 20 20 2f 2a 20 54 72  Agg        /* Tr
c570: 75 65 20 69 66 20 65 78 70 72 65 73 73 69 6f 6e  ue if expression
c580: 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67   contains aggreg
c590: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
c5a0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
c5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
c5c0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
c5d0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
c5e0: 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20   /* The columns 
c5f0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
c600: 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t */.  NameConte
c610: 78 74 20 6e 63 3b 20 20 20 20 2f 2a 20 4e 61 6d  xt nc;    /* Nam
c620: 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 72 65  e context for re
c630: 73 6f 6c 76 69 6e 67 20 70 45 20 2a 2f 0a 0a 20  solving pE */.. 
c640: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c650: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
c660: 2c 20 26 69 29 3d 3d 30 20 29 3b 0a 20 20 70 45  , &i)==0 );.  pE
c670: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
c680: 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 49 66  pEList;..  /* If
c690: 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73   the term is a s
c6a0: 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65 72  imple identifier
c6b0: 20 74 68 61 74 20 74 72 79 20 74 6f 20 6d 61 74   that try to mat
c6c0: 63 68 20 74 68 61 74 20 69 64 65 6e 74 69 66 69  ch that identifi
c6d0: 65 72 0a 20 20 2a 2a 20 61 67 61 69 6e 73 74 20  er.  ** against 
c6e0: 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e  a column name in
c6f0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
c700: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 2d 3e  .  */.  if( pE->
c710: 6f 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 28 70 45  op==TK_ID || (pE
c720: 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ->op==TK_STRING 
c730: 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30  && pE->token.z[0
c740: 5d 21 3d 27 5c 27 27 29 20 29 7b 0a 20 20 20 20  ]!='\'') ){.    
c750: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
c760: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 63 68  arse->db;.    ch
c770: 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74  ar *zCol = sqlit
c780: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
c790: 64 62 2c 20 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b  db, &pE->token);
c7a0: 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30  .    if( zCol==0
c7b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c7c0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   -1;.    }.    f
c7d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
c7e0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
c7f0: 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d       char *zAs =
c800: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
c810: 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ame;.      if( z
c820: 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  As!=0 && sqlite3
c830: 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f  StrICmp(zAs, zCo
c840: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
c850: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c860: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  b, zCol);.      
c870: 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20    return i+1;.  
c880: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
c890: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
c8a0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 0a 20 20  , zCol);.  }..  
c8b0: 2f 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e  /* Resolve all n
c8c0: 61 6d 65 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ames in the ORDE
c8d0: 52 20 42 59 20 74 65 72 6d 20 65 78 70 72 65 73  R BY term expres
c8e0: 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  sion.  */.  mems
c8f0: 65 74 28 26 6e 63 2c 20 30 2c 20 73 69 7a 65 6f  et(&nc, 0, sizeo
c900: 66 28 6e 63 29 29 3b 0a 20 20 6e 63 2e 70 50 61  f(nc));.  nc.pPa
c910: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
c920: 6e 63 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  nc.pSrcList = pS
c930: 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 6e  elect->pSrc;.  n
c940: 63 2e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  c.pEList = pELis
c950: 74 3b 0a 20 20 6e 63 2e 61 6c 6c 6f 77 41 67 67  t;.  nc.allowAgg
c960: 20 3d 20 31 3b 0a 20 20 6e 63 2e 6e 45 72 72 20   = 1;.  nc.nErr 
c970: 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
c980: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
c990: 65 73 28 26 6e 63 2c 20 70 45 29 20 29 7b 0a 20  es(&nc, pE) ){. 
c9a0: 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e     if( isCompoun
c9b0: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
c9c0: 65 33 45 72 72 6f 72 43 6c 65 61 72 28 70 50 61  e3ErrorClear(pPa
c9d0: 72 73 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rse);.      retu
c9e0: 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rn 0;.    }else{
c9f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
ca00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
ca10: 28 20 6e 63 2e 68 61 73 41 67 67 20 26 26 20 70  ( nc.hasAgg && p
ca20: 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20 2a 70  HasAgg ){.    *p
ca30: 48 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a  HasAgg = 1;.  }.
ca40: 0a 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 6d 70  .  /* For a comp
ca50: 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 77 65 20  ound SELECT, we 
ca60: 6e 65 65 64 20 74 6f 20 74 72 79 20 74 6f 20 6d  need to try to m
ca70: 61 74 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  atch the ORDER B
ca80: 59 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  Y.  ** expressio
ca90: 6e 20 61 67 61 69 6e 73 74 20 61 6e 20 65 78 70  n against an exp
caa0: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
cab0: 65 73 75 6c 74 20 73 65 74 0a 20 20 2a 2f 0a 20  esult set.  */. 
cac0: 20 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 20   if( isCompound 
cad0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
cae0: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
caf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
cb00: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
cb10: 61 72 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  are(pEList->a[i]
cb20: 2e 70 45 78 70 72 2c 20 70 45 29 20 29 7b 0a 20  .pExpr, pE) ){. 
cb30: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b         return i+
cb40: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
cb50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
cb60: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  .}.../*.** Analy
cb70: 7a 65 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  ze and ORDER BY 
cb80: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
cb90: 73 65 20 69 6e 20 61 20 73 69 6d 70 6c 65 20 53  se in a simple S
cba0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
cbb0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
cbc0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
cbd0: 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  seen..**.** Ever
cbe0: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  y term of the OR
cbf0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
cc00: 42 59 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  BY clause needs 
cc10: 74 6f 20 62 65 20 61 6e 0a 2a 2a 20 65 78 70 72  to be an.** expr
cc20: 65 73 73 69 6f 6e 2e 20 20 49 66 20 61 6e 79 20  ession.  If any 
cc30: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
cc40: 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   integer constan
cc50: 74 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 61 74 20  t, then.** that 
cc60: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
cc70: 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 63 6f  placed by the co
cc80: 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 2a 2a 20  rresponding .** 
cc90: 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
cca0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
ccb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
ccc0: 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75 70 42  ocessOrderGroupB
ccd0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
cce0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
ccf0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20  rsing context.  
cd00: 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  Leave error mess
cd10: 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  ages here */.  S
cd20: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
cd30: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
cd40: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e  CT statement con
cd50: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6c 61 75  taining the clau
cd60: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
cd70: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
cd80: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   The ORDER BY or
cd90: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
cda0: 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64   to be processed
cdb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 72 64 65   */.  int isOrde
cdc0: 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31  r,          /* 1
cdd0: 20 66 6f 72 20 4f 52 44 45 52 20 42 59 2e 20 20   for ORDER BY.  
cde0: 30 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 2a  0 for GROUP BY *
cdf0: 2f 0a 20 20 75 38 20 2a 70 48 61 73 41 67 67 20  /.  u8 *pHasAgg 
ce00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
ce10: 20 74 6f 20 54 52 55 45 20 69 66 20 61 6e 79 20   to TRUE if any 
ce20: 74 65 72 6d 20 63 6f 6e 74 61 69 6e 73 20 61 6e  term contains an
ce30: 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 29 7b   aggregate */.){
ce40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
ce50: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
ce60: 2d 3e 64 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  ->db;.  ExprList
ce70: 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28   *pEList;..  if(
ce80: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20   pOrderBy==0 || 
ce90: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
cea0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
ceb0: 6e 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  n 0;.#if SQLITE_
cec0: 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
ced0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
cee0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
cef0: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
cf00: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
cf10: 61 72 20 2a 7a 54 79 70 65 20 3d 20 69 73 4f 72  ar *zType = isOr
cf20: 64 65 72 20 3f 20 22 4f 52 44 45 52 22 20 3a 20  der ? "ORDER" : 
cf30: 22 47 52 4f 55 50 22 3b 0a 20 20 20 20 73 71 6c  "GROUP";.    sql
cf40: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
cf50: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74  rse, "too many t
cf60: 65 72 6d 73 20 69 6e 20 25 73 20 42 59 20 63 6c  erms in %s BY cl
cf70: 61 75 73 65 22 2c 20 7a 54 79 70 65 29 3b 0a 20  ause", zType);. 
cf80: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
cf90: 0a 23 65 6e 64 69 66 0a 20 20 70 45 4c 69 73 74  .#endif.  pEList
cfa0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
cfb0: 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
cfc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
cfd0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 0;.  }.  for(i
cfe0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
cff0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
d000: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 45   int iCol;.    E
d010: 78 70 72 20 2a 70 45 20 3d 20 70 4f 72 64 65 72  xpr *pE = pOrder
d020: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
d030: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
d040: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
d050: 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
d060: 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
d070: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
d080: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  pr ){.        co
d090: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
d0a0: 3d 20 69 73 4f 72 64 65 72 20 3f 20 22 4f 52 44  = isOrder ? "ORD
d0b0: 45 52 22 20 3a 20 22 47 52 4f 55 50 22 3b 0a 20  ER" : "GROUP";. 
d0c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
d0d0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
d0e0: 20 20 20 20 20 20 20 20 20 20 20 22 25 72 20 25             "%r %
d0f0: 73 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f 66  s BY term out of
d100: 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20   range - should 
d110: 62 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  be ".           
d120: 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25  "between 1 and %
d130: 64 22 2c 20 69 2b 31 2c 20 7a 54 79 70 65 2c 20  d", i+1, zType, 
d140: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
d150: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
d160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
d170: 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 20  lse{.      iCol 
d180: 3d 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54 65  = matchOrderByTe
d190: 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61  rmToExprList(pPa
d1a0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 45  rse, pSelect, pE
d1b0: 2c 20 69 2b 31 2c 20 30 2c 20 70 48 61 73 41 67  , i+1, 0, pHasAg
d1c0: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  g);.      if( iC
d1d0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
d1e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
d1f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
d200: 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  iCol>0 ){.      
d210: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
d220: 20 70 45 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20   pE->pColl;.    
d230: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 45    int flags = pE
d240: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
d250: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 73  Collate;.      s
d260: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
d270: 28 64 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20  (db, pE);.      
d280: 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pE = sqlite3Expr
d290: 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
d2a0: 61 5b 69 43 6f 6c 2d 31 5d 2e 70 45 78 70 72 29  a[iCol-1].pExpr)
d2b0: 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
d2c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70  ->a[i].pExpr = p
d2d0: 45 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 20  E;.      if( pE 
d2e0: 26 26 20 70 43 6f 6c 6c 20 26 26 20 66 6c 61 67  && pColl && flag
d2f0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 2d  s ){.        pE-
d300: 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a  >pColl = pColl;.
d310: 20 20 20 20 20 20 20 20 70 45 2d 3e 66 6c 61 67          pE->flag
d320: 73 20 7c 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  s |= flags;.    
d330: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d340: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d350: 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 6e 64 20 4f  ** Analyze and O
d360: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
d370: 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20   BY clause in a 
d380: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d390: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
d3a0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
d3b0: 73 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  s seen..**.** If
d3c0: 20 69 54 61 62 6c 65 3e 30 20 74 68 65 6e 20 6d   iTable>0 then m
d3d0: 61 6b 65 20 74 68 65 20 4e 2d 74 68 20 74 65 72  ake the N-th ter
d3e0: 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
d3f0: 59 20 63 6c 61 75 73 65 20 72 65 66 65 72 20 74  Y clause refer t
d400: 6f 0a 2a 2a 20 74 68 65 20 4e 2d 74 68 20 63 6f  o.** the N-th co
d410: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 54  lumn of table iT
d420: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  able..**.** If i
d430: 54 61 62 6c 65 3d 3d 30 20 74 68 65 6e 20 74 72  Table==0 then tr
d440: 61 6e 73 66 6f 72 6d 20 65 61 63 68 20 74 65 72  ansform each ter
d450: 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
d460: 59 20 63 6c 61 75 73 65 20 74 6f 20 72 65 66 65  Y clause to refe
d470: 72 0a 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  r.** to a column
d480: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
d490: 65 74 20 62 79 20 6e 75 6d 62 65 72 2e 0a 2a 2f  et by number..*/
d4a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63  .static int proc
d4b0: 65 73 73 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72  essCompoundOrder
d4c0: 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
d4d0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
d4e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20  arsing context. 
d4f0: 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73   Leave error mes
d500: 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20  sages here */.  
d510: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
d520: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
d530: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  ECT statement co
d540: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 4f 52 44  ntaining the ORD
d550: 45 52 20 42 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ER BY */.){.  in
d560: 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  t i;.  ExprList 
d570: 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 45 78 70  *pOrderBy;.  Exp
d580: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
d590: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
d5a0: 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31  int moreToDo = 1
d5b0: 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  ;..  pOrderBy = 
d5c0: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
d5d0: 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  y;.  if( pOrderB
d5e0: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
d5f0: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
d600: 64 62 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  db;.#if SQLITE_M
d610: 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
d620: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
d630: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
d640: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
d650: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d660: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d670: 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
d680: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
d690: 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e");.    return 
d6a0: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  1;.  }.#endif.  
d6b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
d6c0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
d6d0: 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  {.    pOrderBy->
d6e0: 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20  a[i].done = 0;. 
d6f0: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c   }.  while( pSel
d700: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
d710: 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65     pSelect = pSe
d720: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
d730: 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  }.  while( pSele
d740: 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20 29  ct && moreToDo )
d750: 7b 0a 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d  {.    moreToDo =
d760: 20 30 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   0;.    pEList =
d770: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
d780: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
d790: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
d7a0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
d7b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
d7c0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
d7d0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
d7e0: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 45 78  l = -1;.      Ex
d7f0: 70 72 20 2a 70 45 2c 20 2a 70 44 75 70 3b 0a 20  pr *pE, *pDup;. 
d800: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
d810: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 29 20 63  y->a[i].done ) c
d820: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
d830: 45 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  E = pOrderBy->a[
d840: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
d850: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
d860: 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43  sInteger(pE, &iC
d870: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ol) ){.        i
d880: 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f  f( iCol<0 || iCo
d890: 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
d8a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
d8b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
d8c0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
d8d0: 20 20 20 22 25 72 20 4f 52 44 45 52 20 42 59 20     "%r ORDER BY 
d8e0: 74 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67  term out of rang
d8f0: 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  e - should be ".
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 62 65               "be
d910: 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c  tween 1 and %d",
d920: 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45   i+1, pEList->nE
d930: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
d940: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
d950: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
d960: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
d970: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
d980: 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20 20 20  b, pE);.        
d990: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
d9a0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
d9b0: 20 20 20 61 73 73 65 72 74 28 70 44 75 70 29 3b     assert(pDup);
d9c0: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20  .          iCol 
d9d0: 3d 20 6d 61 74 63 68 4f 72 64 65 72 42 79 54 65  = matchOrderByTe
d9e0: 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61  rmToExprList(pPa
d9f0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 44  rse, pSelect, pD
da00: 75 70 2c 20 69 2b 31 2c 20 31 2c 20 30 29 3b 0a  up, i+1, 1, 0);.
da10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
da20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
da30: 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20  ete(db, pDup);. 
da40: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
da50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
da60: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
da70: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
da80: 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20   if( iCol>0 ){. 
da90: 20 20 20 20 20 20 20 70 45 2d 3e 6f 70 20 3d 20         pE->op = 
daa0: 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TK_INTEGER;.    
dab0: 20 20 20 20 70 45 2d 3e 66 6c 61 67 73 20 7c 3d      pE->flags |=
dac0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
dad0: 20 20 20 20 20 20 70 45 2d 3e 69 54 61 62 6c 65        pE->iTable
dae0: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20   = iCol;.       
daf0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
db00: 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  done = 1;.      
db10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
db20: 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 20 20 20  oreToDo = 1;.   
db30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
db40: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
db50: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 66  ->pNext;.  }.  f
db60: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
db70: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
db80: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
db90: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20  y->a[i].done==0 
dba0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
dbb0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
dbc0: 20 22 25 72 20 4f 52 44 45 52 20 42 59 20 74 65   "%r ORDER BY te
dbd0: 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  rm does not matc
dbe0: 68 20 61 6e 79 20 22 0a 20 20 20 20 20 20 20 20  h any ".        
dbf0: 20 20 20 20 22 63 6f 6c 75 6d 6e 20 69 6e 20 74      "column in t
dc00: 68 65 20 72 65 73 75 6c 74 20 73 65 74 22 2c 20  he result set", 
dc10: 69 2b 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  i+1);.      retu
dc20: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
dc30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
dc40: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
dc50: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
dc60: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
dc70: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
dc80: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
dc90: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
dca0: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
dcb0: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
dcc0: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
dcd0: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
dce0: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
dcf0: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
dd00: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
dd10: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
dd20: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
dd30: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  >pVdbe = sqlite3
dd40: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
dd50: 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20  e->db);.#ifndef 
dd60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
dd70: 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20  E.    if( v ){. 
dd80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd90: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61  AddOp0(v, OP_Tra
dda0: 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ce);.    }.#endi
ddb0: 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  f.  }.  return v
ddc0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
ddd0: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
dde0: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
ddf0: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
de00: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
de10: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
de20: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  et expressions. 
de30: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
de40: 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70  set hold the exp
de50: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
de60: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
de70: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
de80: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
de90: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
dea0: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
deb0: 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20  r NULL if those 
dec0: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
ded0: 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64  tted. iLimit and
dee0: 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65   iOffset .** are
def0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d   the integer mem
df00: 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ory register num
df10: 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72  bers for counter
df20: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
df30: 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20  e .** the limit 
df40: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
df50: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  there is no limi
df60: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
df70: 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74   then .** iLimit
df80: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
df90: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
dfa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
dfb0: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
dfc0: 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   of iLimit and i
dfd0: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
dfe0: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
dff0: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
e000: 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  y pLimit and pOf
e010: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
e020: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
e030: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
e040: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
e050: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
e060: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
e070: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
e080: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
e090: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
e0a0: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
e0b0: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
e0c0: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
e0d0: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
e0e0: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
e0f0: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
e100: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
e110: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
e120: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
e130: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
e140: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
e150: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
e160: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
e170: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
e180: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
e190: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
e1a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
e1b0: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
e1c0: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
e1d0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
e1e0: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
e1f0: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
e200: 72 31 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  r1;.  if( p->iLi
e210: 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  mit ) return;.. 
e220: 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54   /* .  ** "LIMIT
e230: 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77   -1" always show
e240: 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65  s all rows.  The
e250: 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20  re is some.  ** 
e260: 63 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75  contraversy abou
e270: 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65  t what the corre
e280: 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75  ct behavior shou
e290: 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20  ld be..  ** The 
e2a0: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
e2b0: 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74  tation interpret
e2c0: 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d  s "LIMIT 0" to m
e2d0: 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73  ean.  ** no rows
e2e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
e2f0: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d  pLimit ){.    p-
e300: 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  >iLimit = iLimit
e310: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
e320: 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  m;.    v = sqlit
e330: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
e340: 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20  );.    if( v==0 
e350: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
e360: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
e370: 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c  arse, p->pLimit,
e380: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71   iLimit);.    sq
e390: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
e3a0: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
e3b0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 56 64   iLimit);.    Vd
e3c0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
e3d0: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
e3e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e3f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a  AddOp2(v, OP_IfZ
e400: 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72  ero, iLimit, iBr
e410: 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eak);.  }.  if( 
e420: 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20  p->pOffset ){.  
e430: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
e440: 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
e450: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28  e->nMem;.    if(
e460: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
e470: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
e480: 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ++;   /* Allocat
e490: 65 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73  e an extra regis
e4a0: 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66  ter for limit+of
e4b0: 66 73 65 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  fset */.    }.  
e4c0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
e4d0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
e4e0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
e4f0: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
e500: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e510: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66   p->pOffset, iOf
e520: 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  fset);.    sqlit
e530: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e540: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
e550: 66 66 73 65 74 29 3b 0a 20 20 20 20 56 64 62 65  ffset);.    Vdbe
e560: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
e570: 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  SET counter"));.
e580: 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
e590: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
e5a0: 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73   OP_IfPos, iOffs
e5b0: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
e5c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e5d0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66  _Integer, 0, iOf
e5e0: 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  fset);.    sqlit
e5f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
e600: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 69 66  , addr1);.    if
e610: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ( p->pLimit ){. 
e620: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e630: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64  AddOp3(v, OP_Add
e640: 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
e650: 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20  t, iOffset+1);. 
e660: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
e670: 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
e680: 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64  ET"));.      add
e690: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
e6a0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
e6b0: 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  os, iLimit);.   
e6c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e6d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
e6e0: 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b  er, -1, iOffset+
e6f0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
e700: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
e710: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20   addr1);.    }. 
e720: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
e730: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
e740: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
e750: 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
e760: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
e770: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
e780: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
e790: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   of.** the resul
e7a0: 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f  t set for the co
e7b0: 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74  mpound-select st
e7c0: 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65  atement "p".  Re
e7d0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20  turn NULL if.** 
e7e0: 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e  the column has n
e7f0: 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  o default collat
e800: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
e810: 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e  .** The collatin
e820: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
e830: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
e840: 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ct is taken from
e850: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
e860: 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65  t term of the se
e870: 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20  lect that has a 
e880: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
e890: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  ce..*/.static Co
e8a0: 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65  llSeq *multiSele
e8b0: 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ctCollSeq(Parse 
e8c0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
e8d0: 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  *p, int iCol){. 
e8e0: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a   CollSeq *pRet;.
e8f0: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
e900: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75  ){.    pRet = mu
e910: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
e920: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69  (pParse, p->pPri
e930: 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c  or, iCol);.  }el
e940: 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  se{.    pRet = 0
e950: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74  ;.  }.  if( pRet
e960: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ==0 ){.    pRet 
e970: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
e980: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
e990: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
e9a0: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
e9b0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e  turn pRet;.}.#en
e9c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
e9d0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
e9e0: 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72  CT */../* Forwar
e9f0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
ea00: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
ea10: 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
ea20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
ea30: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
ea40: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
ea50: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
ea60: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
ea70: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
ea80: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
ea90: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
eaa0: 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
eab0: 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
eac0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a   results */.);..
ead0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
eae0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
eaf0: 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  LECT./*.** This 
eb00: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
eb10: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63  d to process a c
eb20: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f  ompound query fo
eb30: 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f  rm from.** two o
eb40: 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
eb50: 71 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e  queries using UN
eb60: 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  ION, UNION ALL, 
eb70: 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e  EXCEPT, or.** IN
eb80: 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70  TERSECT.**.** "p
eb90: 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  " points to the 
eba0: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68  right-most of th
ebb0: 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20  e two queries.  
ebc0: 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65  the query on the
ebd0: 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70  .** left is p->p
ebe0: 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74  Prior.  The left
ebf0: 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73   query could als
ec00: 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  o be a compound 
ec10: 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63  query.** in whic
ec20: 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  h case this rout
ec30: 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
ec40: 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20  ed recursively. 
ec50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
ec60: 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  ts of the total 
ec70: 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20  query are to be 
ec80: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64  written into a d
ec90: 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  estination.** of
eca0: 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68   type eDest with
ecb0: 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d   parameter iParm
ecc0: 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
ecd0: 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74  1:  Consider a t
ece0: 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e  hree-way compoun
ecf0: 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
ed00: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
ed10: 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  T a FROM t1 UNIO
ed20: 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  N SELECT b FROM 
ed30: 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t2 UNION SELECT 
ed40: 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20  c FROM t3.**.** 
ed50: 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
ed60: 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66  s parsed up as f
ed70: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
ed80: 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20    SELECT c FROM 
ed90: 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20  t3.**      |.** 
eda0: 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45       `----->  SE
edb0: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a  LECT b FROM t2.*
edc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
edd0: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
ede0: 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53       `------>  S
edf0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a  ELECT a FROM t1.
ee00: 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73  **.** The arrows
ee10: 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20   in the diagram 
ee20: 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20  above represent 
ee30: 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f  the Select.pPrio
ee40: 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f  r pointer..** So
ee50: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
ee60: 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
ee70: 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  p equal to the t
ee80: 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  3 query, then.**
ee90: 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20   pPrior will be 
eea0: 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70  the t2 query.  p
eeb0: 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f  ->op will be TK_
eec0: 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61  UNION in this ca
eed0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65  se..**.** Notice
eee0: 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66   that because of
eef0: 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20   the way SQLite 
ef00: 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20  parses compound 
ef10: 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20  SELECTs, the.** 
ef20: 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63  individual selec
ef30: 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20  ts always group 
ef40: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
ef50: 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ht..*/.static in
ef60: 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20  t multiSelect(. 
ef70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ef80: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
ef90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
efa0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
efb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
efc0: 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
efd0: 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
efe0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
eff0: 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
f000: 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
f010: 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
f020: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f030: 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65  E_OK;   /* Succe
f040: 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73  ss code from a s
f050: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53  ubroutine */.  S
f060: 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
f070: 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
f080: 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
f090: 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
f0a0: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
f0b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
f0c0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
f0d0: 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
f0e0: 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20  ectDest dest;   
f0f0: 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76     /* Alternativ
f100: 65 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69  e data destinati
f110: 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
f120: 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a  pDelete = 0;  /*
f130: 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65   Chain of simple
f140: 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65   selects to dele
f150: 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  te */.  sqlite3 
f160: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
f170: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
f180: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61  tion */..  /* Ma
f190: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
f1a0: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
f1b0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
f1c0: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
f1d0: 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
f1e0: 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
f1f0: 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
f200: 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
f210: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
f220: 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  IT..  */.  asser
f230: 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f  t( p && p->pPrio
f240: 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  r );  /* Calling
f250: 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e   function guaran
f260: 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a  tees this much *
f270: 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
f280: 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  >db;.  pPrior = 
f290: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
f2a0: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
f2b0: 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20  ghtmost!=pPrior 
f2c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  );.  assert( pPr
f2d0: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ior->pRightmost=
f2e0: 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29  =p->pRightmost )
f2f0: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
f300: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
f310: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f320: 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59  pParse,"ORDER BY
f330: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
f340: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
f350: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
f360: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
f370: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
f380: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
f390: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
f3a0: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
f3b0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
f3c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f3d0: 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
f3e0: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
f3f0: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
f400: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
f410: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
f420: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
f430: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
f440: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20  t_end;.  }..  v 
f450: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
f460: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
f470: 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20  rt( v!=0 );  /* 
f480: 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79  The VDBE already
f490: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
f4a0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
f4b0: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
f4c0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
f4d0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
f4e0: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
f4f0: 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a   dest = *pDest;.
f500: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
f510: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
f520: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
f530: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  >pEList );.    s
f540: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f550: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
f560: 65 72 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d  eral, dest.iParm
f570: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
f580: 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44  pr);.    dest.eD
f590: 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b  est = SRT_Table;
f5a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
f5b0: 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73  sure all SELECTs
f5c0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
f5d0: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
f5e0: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
f5f0: 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72  ts.  ** in their
f600: 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20   result sets..  
f610: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
f620: 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
f630: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66  ->pEList );.  if
f640: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
f650: 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69  pr!=pPrior->pELi
f660: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
f670: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f680: 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54  (pParse, "SELECT
f690: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e  s to the left an
f6a0: 64 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20  d right of %s". 
f6b0: 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61       " do not ha
f6c0: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
f6d0: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
f6e0: 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e  umns", selectOpN
f6f0: 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
f700: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
f710: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
f720: 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  nd;.  }..  /* Co
f730: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74  mpound SELECTs t
f740: 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  hat have an ORDE
f750: 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
f760: 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
f770: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
f780: 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
f790: 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
f7a0: 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72  lectOrderBy(pPar
f7b0: 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
f7c0: 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
f7d0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
f7e0: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
f7f0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
f800: 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20  .  */.  switch( 
f810: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
f820: 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20  e TK_ALL: {.    
f830: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a    int addr = 0;.
f840: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
f850: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
f860: 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
f870: 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
f880: 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
f890: 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  >pOffset = p->pO
f8a0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 72 63 20  ffset;.      rc 
f8b0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
f8c0: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
f8d0: 26 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 29 3b  &dest, 0, 0, 0);
f8e0: 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
f8f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
f900: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
f910: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
f920: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
f930: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
f940: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
f950: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  or = 0;.      p-
f960: 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72  >iLimit = pPrior
f970: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
f980: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72  p->iOffset = pPr
f990: 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  ior->iOffset;.  
f9a0: 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69      if( p->iLimi
f9b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64  t ){.        add
f9c0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
f9d0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp1(v, OP_IfZe
f9e0: 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a  ro, p->iLimit);.
f9f0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
fa00: 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68  ent((v, "Jump ah
fa10: 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61  ead if LIMIT rea
fa20: 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d  ched"));.      }
fa30: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
fa40: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
fa50: 2c 20 70 2c 20 26 64 65 73 74 2c 20 30 2c 20 30  , p, &dest, 0, 0
fa60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  , 0);.      pDel
fa70: 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
fa80: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
fa90: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
faa0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
fab0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
fac0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
fad0: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  }.      if( addr
fae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
faf0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
fb00: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
fb10: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
fb20: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
fb30: 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
fb40: 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
fb50: 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
fb60: 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
fb70: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
fb80: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
fb90: 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
fba0: 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b       int op = 0;
fbb0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
fbc0: 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
fbd0: 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
fbe0: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
fbf0: 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
fc00: 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
fc10: 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
fc20: 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
fc30: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
fc40: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
fc50: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
fc60: 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64  of p->nLimit and
fc70: 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20   p->nOffset */. 
fc80: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
fc90: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
fca0: 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20  uniondest;..    
fcb0: 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f    priorOp = SRT_
fcc0: 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  Union;.      if(
fcd0: 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72 69   dest.eDest==pri
fce0: 6f 72 4f 70 20 26 26 20 21 70 2d 3e 70 4c 69 6d  orOp && !p->pLim
fcf0: 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73 65  it && !p->pOffse
fd00: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
fd10: 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
fd20: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
fd30: 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
fd40: 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
fd50: 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
fd60: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
fd70: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74   unionTab = dest
fd80: 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65  .iParm;.      }e
fd90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
fda0: 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
fdb0: 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
fdc0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
fdd0: 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
fde0: 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
fdf0: 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
fe00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
fe10: 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65  nionTab = pParse
fe20: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
fe30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
fe40: 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
fe50: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
fe60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fe70: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
fe80: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
fe90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
fea0: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
feb0: 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
fec0: 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
fed0: 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
fee0: 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74         p->pRight
fef0: 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d  most->usesEphm =
ff00: 20 31 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   1;.        asse
ff10: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
ff20: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
ff30: 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45  /* Code the SELE
ff40: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
ff50: 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20   our left.      
ff60: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
ff70: 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72   !pPrior->pOrder
ff80: 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  By );.      sqli
ff90: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
ffa0: 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72  t(&uniondest, pr
ffb0: 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29  iorOp, unionTab)
ffc0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
ffd0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
ffe0: 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f  e, pPrior, &unio
fff0: 6e 64 65 73 74 2c 20 30 2c 20 30 2c 20 30 29 3b  ndest, 0, 0, 0);
10000 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
10010 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
10020 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
10030 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
10040 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
10050 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
10060 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ent.      */.   
10070 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
10080 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20  _EXCEPT ){.     
10090 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65     op = SRT_Exce
100a0 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  pt;.      }else{
100b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
100c0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
100d0 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   );.        op =
100e0 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
100f0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
10100 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
10110 2d 3e 64 69 73 61 6c 6c 6f 77 4f 72 64 65 72 42  ->disallowOrderB
10120 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69  y = 0;.      pLi
10130 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
10140 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
10150 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66   = 0;.      pOff
10160 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
10170 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
10180 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e  et = 0;.      un
10190 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20  iondest.eDest = 
101a0 6f 70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  op;.      rc = s
101b0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
101c0 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65  rse, p, &unionde
101d0 73 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  st, 0, 0, 0);.  
101e0 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
101f0 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
10200 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
10210 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
10220 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
10230 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
10240 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
10250 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
10260 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
10270 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
10280 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
10290 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
102a0 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
102b0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
102c0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
102d0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
102e0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
102f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
10300 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
10310 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
10320 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
10330 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
10340 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = pOffset;.     
10350 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->iLimit = 0;.
10360 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
10370 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
10380 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
10390 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
103a0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20  end;.      }... 
103b0 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
103c0 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  the data in the 
103d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
103e0 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
103f0 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69  rm.      ** it i
10400 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e  s that we curren
10410 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  tly need..      
10420 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  */      .      i
10430 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  f( dest.eDest!=p
10440 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54  riorOp || unionT
10450 61 62 21 3d 64 65 73 74 2e 69 50 61 72 6d 20 29  ab!=dest.iParm )
10460 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
10470 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
10480 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  art;.        ass
10490 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
104a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
104b0 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 43 61  st.eDest==SRT_Ca
104c0 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
104d0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
104e0 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
104f0 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
10500 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
10510 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
10520 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  r;.          gen
10530 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
10540 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
10550 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
10560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
10570 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
10580 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
10590 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
105a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
105b0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
105c0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
105d0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
105e0 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
105f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10600 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
10610 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
10620 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  reak);.        i
10630 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
10640 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
10650 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  );.        selec
10660 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
10670 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
10680 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45   unionTab, p->pE
10690 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106b0 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73       0, -1, &des
106c0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
106d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
106e0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
106f0 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
10700 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10710 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
10720 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
10730 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
10740 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
10750 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
10760 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10770 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10780 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
10790 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
107a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
107b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
107c0 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20  NTERSECT: {.    
107d0 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
107e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
107f0 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
10800 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
10810 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
10820 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
10830 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
10840 74 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b  t intersectdest;
10850 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a  .      int r1;..
10860 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45        /* INTERSE
10870 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  CT is different 
10880 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
10890 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65  since it require
108a0 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74  s.      ** two t
108b0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
108c0 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69    Hence it has i
108d0 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65  ts own case.  Be
108e0 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  gin.      ** by 
108f0 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
10900 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
10910 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
10920 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
10930 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
10940 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
10950 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Tab++;.      ass
10960 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
10970 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64  ==0 );..      ad
10980 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
10990 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
109a0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31  nEphemeral, tab1
109b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
109c0 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
109d0 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
109e0 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
109f0 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
10a00 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74  .      p->pRight
10a10 6d 6f 73 74 2d 3e 75 73 65 73 45 70 68 6d 20 3d  most->usesEphm =
10a20 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
10a30 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a  ( p->pEList );..
10a40 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
10a50 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
10a60 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
10a70 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
10a80 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
10a90 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
10aa0 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65  estInit(&interse
10ab0 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f  ctdest, SRT_Unio
10ac0 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20  n, tab1);.      
10ad0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
10ae0 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
10af0 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  r, &intersectdes
10b00 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  t, 0, 0, 0);.   
10b10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10b20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
10b30 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10b40 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
10b50 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
10b60 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
10b70 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
10b80 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
10b90 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
10ba0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10bb0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
10bc0 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
10bd0 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
10be0 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
10bf0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
10c00 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
10c10 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
10c20 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
10c30 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
10c40 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
10c50 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
10c60 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
10c70 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
10c80 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
10c90 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 50  intersectdest.iP
10ca0 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20  arm = tab2;.    
10cb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
10cc0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
10cd0 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
10ce0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
10cf0 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
10d00 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
10d10 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
10d20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10d30 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
10d40 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
10d50 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
10d60 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
10d70 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
10d80 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10d90 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
10da0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10db0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
10dc0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
10dd0 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
10de0 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
10df0 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
10e00 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
10e10 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
10e20 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
10e30 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
10e40 65 73 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63  est==SRT_Callbac
10e50 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c  k ){.        Sel
10e60 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
10e70 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
10e80 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
10e90 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
10ea0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
10eb0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
10ec0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
10ed0 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
10ee0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10ef0 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
10f00 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
10f10 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20  ;.      iCont = 
10f20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
10f30 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63  abel(v);.      c
10f40 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
10f50 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
10f60 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
10f70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10f80 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
10f90 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ab1, iBreak);.  
10fa0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
10fb0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
10fc0 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  e);.      iStart
10fd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10fe0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  dOp2(v, OP_RowKe
10ff0 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20  y, tab1, r1);.  
11000 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11010 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 46  ddOp3(v, OP_NotF
11020 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
11030 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  t, r1);.      sq
11040 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11050 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
11060 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
11070 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
11080 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
11090 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  1, p->pEList->nE
110a0 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
110b0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 2d 31             0, -1
110c0 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
110d0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
110e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
110f0 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
11100 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11110 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11120 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
11130 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
11140 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
11150 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
11160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11170 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
11180 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
11190 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
111a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
111b0 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
111c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
111d0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
111e0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
111f0 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
11200 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
11210 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
11220 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
11230 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
11240 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
11250 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
11260 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
11270 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
11280 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
11290 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
112a0 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
112b0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
112c0 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
112d0 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
112e0 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
112f0 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
11300 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
11310 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
11320 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
11330 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
11340 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
11350 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
11360 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
11370 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
11380 3e 75 73 65 73 45 70 68 6d 20 29 7b 0a 20 20 20  >usesEphm ){.   
11390 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
113b0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
113c0 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  /.    KeyInfo *p
113d0 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  KeyInfo;        
113e0 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67      /* Collating
113f0 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
11400 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
11410 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
11420 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
11430 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
11440 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20   through SELECT 
11450 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
11460 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f    CollSeq **apCo
11470 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
11480 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
11490 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d  hrough pKeyInfo-
114a0 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20  >aColl[] */.    
114b0 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
114d0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
114e0 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
114f0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
11500 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
11510 70 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  p );.    nCol = 
11520 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
11530 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
11540 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
11550 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20  Zero(db,.       
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
11580 29 2b 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43  )+nCol*(sizeof(C
11590 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a  ollSeq*) + 1));.
115a0 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
115b0 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
115c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
115d0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
115e0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
115f0 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e  ..    pKeyInfo->
11600 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
11610 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69     pKeyInfo->nFi
11620 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20  eld = nCol;..   
11630 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
11640 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
11650 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
11660 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
11670 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
11680 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
11690 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
116a0 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
116b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
116c0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
116d0 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
116e0 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
116f0 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
11700 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
11710 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
11720 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
11730 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
11740 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
11750 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hm[i];.        i
11760 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
11770 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
11780 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
11790 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
117a0 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
117b0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
117c0 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
117d0 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
117e0 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
117f0 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
11800 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11810 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
11820 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  hm[1]<0 );.     
11830 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
11850 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
11860 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
11870 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11880 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
11890 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b   addr, (char*)pK
118a0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
118b0 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  FO);.        pLo
118c0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
118d0 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  [i] = -1;.      
118e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
118f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b  te3DbFree(db, pK
11900 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75  eyInfo);.  }..mu
11910 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a  lti_select_end:.
11920 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20    pDest->iMem = 
11930 64 65 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44 65  dest.iMem;.  pDe
11940 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74 2e  st->nMem = dest.
11950 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53  nMem;.  sqlite3S
11960 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
11970 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
11980 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
11990 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
119a0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
119b0 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  /../*.** Code an
119c0 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
119d0 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
119e0 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
119f0 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
11a00 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
11a10 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
11a20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
11a30 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d  ned in pIn->iMem
11a40 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20  .  There are.** 
11a50 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e  pIn->nMem column
11a60 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20  s to be output. 
11a70 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20   pDest is where 
11a80 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c  the output shoul
11a90 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a  d.** be sent..**
11aa0 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73  .** regReturn is
11ab0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
11ac0 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  he register hold
11ad0 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
11ae0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64  ne.** return add
11af0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  ress..**.** If r
11b00 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74  egPrev>0 then it
11b10 20 69 73 20 61 20 74 68 65 20 66 69 72 73 74 20   is a the first 
11b20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
11b30 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
11b40 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
11b50 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
11b60 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
11b70 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
11b80 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
11b90 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
11ba0 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
11bb0 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
11bc0 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
11bd0 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
11be0 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
11bf0 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
11c00 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
11c10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
11c20 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
11c30 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
11c40 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
11c50 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
11c60 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
11c70 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
11c80 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
11c90 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11ca0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11cb0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
11cc0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
11cd0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
11ce0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
11cf0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
11d00 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
11d10 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
11d20 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
11d30 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
11d40 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
11d50 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
11d60 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
11d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11d80 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
11d90 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
11da0 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
11db0 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
11dc0 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
11dd0 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
11de0 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
11df0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
11e00 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
11e10 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
11e20 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
11e30 74 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20  t p4type,       
11e40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34 20        /* The p4 
11e50 74 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e 66  type for pKeyInf
11e60 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  o */.  int iBrea
11e70 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
11e80 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
11e90 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
11ea0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
11eb0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
11ec0 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
11ed0 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
11ee0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
11ef0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
11f00 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
11f10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
11f20 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
11f30 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
11f40 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
11f50 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
11f60 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
11f70 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
11f80 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20  int j1, j2;.    
11f90 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
11fa0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
11fb0 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20  ot, regPrev);.  
11fc0 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64    j2 = sqlite3Vd
11fd0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
11fe0 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d 65  ompare, pIn->iMe
11ff0 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  m, regPrev+1, pI
12000 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20  n->nMem,.       
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
12030 65 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b  eyInfo, p4type);
12040 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12050 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
12060 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e  p, j2+2, iContin
12070 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73  ue, j2+2);.    s
12080 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
12090 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73  re(v, j1);.    s
120a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
120b0 70 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  py(pParse, pIn->
120c0 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c  iMem, regPrev+1,
120d0 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20   pIn->nMem);.   
120e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
120f0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
12100 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 1, regPrev);. 
12110 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
12120 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
12130 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  d ) return 0;.. 
12140 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65   /* Suppress the
12150 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
12160 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65  T entries if the
12170 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20  re is an OFFSET 
12180 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f  clause.  */.  co
12190 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69  deOffset(v, p, i
121a0 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77  Continue);..  sw
121b0 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65  itch( pDest->eDe
121c0 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f  st ){.    /* Sto
121d0 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
121e0 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
121f0 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
12200 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
12210 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
12220 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
12230 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
12240 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
12250 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
12260 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
12270 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
12280 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12290 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
122a0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d  MakeRecord, pIn-
122b0 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d  >iMem, pIn->nMem
122c0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
122d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
122e0 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
122f0 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 32 29  Dest->iParm, r2)
12300 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12310 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12320 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
12330 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
12340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12350 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
12360 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
12370 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
12380 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
12390 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
123a0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
123b0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
123c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
123d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
123e0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
123f0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
12400 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
12410 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
12420 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e  SELECT ...)" con
12430 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74  struct,.    ** t
12440 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64  hen there should
12450 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65   be a single ite
12460 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
12470 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20   Write this.    
12480 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65  ** item into the
12490 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20   set table with 
124a0 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20  bogus data..    
124b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
124c0 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Set: {.      int
124d0 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72   r1;.      asser
124e0 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20  t( pIn->nMem==1 
124f0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69  );.      p->affi
12500 6e 69 74 79 20 3d 20 0a 20 20 20 20 20 20 20 20  nity = .        
12510 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
12520 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73  ffinity(p->pELis
12530 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
12540 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b  Dest->affinity);
12550 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
12560 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
12570 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
12580 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
12590 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
125a0 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72   pIn->iMem, 1, r
125b0 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c  1, &p->affinity,
125c0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
125d0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
125e0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
125f0 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b  , pIn->iMem, 1);
12600 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12610 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12620 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  dxInsert, pDest-
12630 3e 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20  >iParm, r1);.   
12640 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
12650 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
12660 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
12670 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20  k;.    }..#if 0 
12680 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73   /* Never occurs
12690 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   on an ORDER BY 
126a0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20  query */.    /* 
126b0 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
126c0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
126d0 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
126e0 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
126f0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
12700 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
12710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12720 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
12730 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69  ger, 1, pDest->i
12740 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Parm);.      /* 
12750 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
12760 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
12770 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
12780 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
12790 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
127a0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
127b0 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
127c0 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
127d0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
127e0 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
127f0 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
12800 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
12810 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
12820 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
12830 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
12840 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
12850 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
12860 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
12870 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20  >nMem==1 );.    
12880 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
12890 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
128a0 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e  n->iMem, pDest->
128b0 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
128c0 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
128d0 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
128e0 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
128f0 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
12900 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
12910 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
12920 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
12930 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  RY */..    /* Se
12940 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  nd the data to t
12950 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  he callback func
12960 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62  tion or to a sub
12970 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65  routine.  In the
12980 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20  .    ** case of 
12990 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68  a subroutine, th
129a0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73  e subroutine its
129b0 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62  elf is responsib
129c0 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f  le for.    ** po
129d0 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66  pping the data f
129e0 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20  rom the stack.. 
129f0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
12a00 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a  RT_Coroutine: {.
12a10 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d        if( pDest-
12a20 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >iMem==0 ){.    
12a30 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20      pDest->iMem 
12a40 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
12a50 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  Range(pParse, pI
12a60 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20  n->nMem);.      
12a70 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20    pDest->nMem = 
12a80 70 49 6e 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  pIn->nMem;.     
12a90 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
12aa0 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
12ab0 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  rse, pIn->iMem, 
12ac0 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 70 44 65  pDest->iMem, pDe
12ad0 73 74 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  st->nMem);.     
12ae0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12af0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
12b00 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20  pDest->iParm);. 
12b10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12b20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  }..    case SRT_
12b30 43 61 6c 6c 62 61 63 6b 3a 20 7b 0a 20 20 20 20  Callback: {.    
12b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12b50 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
12b60 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  Row, pIn->iMem, 
12b70 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  pIn->nMem);.    
12b80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
12b90 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
12ba0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d  (pParse, pIn->iM
12bb0 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a  em, pIn->nMem);.
12bc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12bd0 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
12be0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
12bf0 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73  GGER).    /* Dis
12c00 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
12c10 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
12c20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
12c30 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
12c40 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
12c50 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
12c60 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
12c70 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
12c80 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
12c90 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
12ca0 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
12cb0 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
12cc0 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
12cd0 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
12ce0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
12cf0 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
12d00 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
12d10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12d20 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
12d30 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
12d40 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
12d50 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
12d60 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ached..  */.  if
12d70 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
12d80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12d90 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
12da0 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31  m, p->iLimit, -1
12db0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12dc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12dd0 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  fZero, p->iLimit
12de0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 0a  , iBreak);.  }..
12df0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
12e00 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
12e10 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
12e20 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
12e30 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
12e40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12e50 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
12e60 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a  rn, regReturn);.
12e70 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
12e80 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61  }../*.** Alterna
12e90 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65  tive compound se
12ea0 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61  lect code genera
12eb0 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68  tor for cases wh
12ec0 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  en there.** is a
12ed0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
12ee0 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  e..**.** We assu
12ef0 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  me a query of th
12f00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
12f10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65  :.**.**      <se
12f20 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f  lectA>  <operato
12f30 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f  r>  <selectB>  O
12f40 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79  RDER BY <orderby
12f50 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65  list>.**.** <ope
12f60 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66  rator> is one of
12f70 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f   UNION ALL, UNIO
12f80 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
12f90 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64  TERSECT.  The id
12fa0 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65  ea.** is to code
12fb0 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20   both <selectA> 
12fc0 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69  and <selectB> wi
12fd0 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
12fe0 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d  clause as.** co-
12ff0 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20  routines.  Then 
13000 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  run the co-routi
13010 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20  nes in parallel 
13020 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65  and merge the re
13030 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68  sults.** into th
13040 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64  e output.  In ad
13050 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77  dition to the tw
13060 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61  o coroutines (ca
13070 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64  lled selectA and
13080 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65  .** selectB) the
13090 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74  re are 7 subrout
130a0 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  ines:.**.**    o
130b0 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utA:    Move the
130c0 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
130d0 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65  electA coroutine
130e0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
130f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13100 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
13110 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  query..**.**    
13120 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68  outB:    Move th
13130 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
13140 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e  selectB coroutin
13150 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
13160 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
13170 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
13180 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67   query.  (Only g
13190 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49  enerated for UNI
131a0 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ON and.**       
131b0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e        UNION ALL.
131c0 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53    EXCEPT and INS
131d0 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75  ERTSECT never ou
131e0 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a  tput a row that.
131f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61  **             a
13200 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42  ppears only in B
13210 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42  .).**.**    AltB
13220 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
13230 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
13240 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
13250 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a  nes and A<B..**.
13260 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43  **    AeqB:    C
13270 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
13280 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
13290 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
132a0 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  d A==B..**.**   
132b0 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AgtB:    Called
132c0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
132d0 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
132e0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42  routines and A>B
132f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  ..**.**    EofA:
13300 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
13310 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
13320 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a  d from selectA..
13330 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20  **.**    EofB:  
13340 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
13350 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
13360 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a  from selectB..**
13370 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
13380 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
13390 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75  tter five subrou
133a0 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20  tines depend on 
133b0 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61  which .** <opera
133c0 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a  tor> is used:.**
133d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
133e0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20     UNION ALL    
133f0 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20       UNION      
13400 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20        EXCEPT    
13410 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a        INTERSECT.
13420 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  **          ----
13430 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
13440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
13450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
13460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
13470 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74  **   AltB:   out
13480 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
13490 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
134a0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
134b0 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20      nextA.**.** 
134c0 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20    AeqB:   outA, 
134d0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
134e0 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20  xtA             
134f0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75  nextA         ou
13500 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20  tA, nextA.**.** 
13510 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20    AgtB:   outB, 
13520 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
13530 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
13540 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20  nextB           
13550 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45   nextB.**.**   E
13560 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  ofA:   outB, nex
13570 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
13580 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c  xtB          hal
13590 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61  t             ha
135a0 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a  lt.**.**   EofB:
135b0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
135c0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
135d0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
135e0 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a  A         halt.*
135f0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42  *.** In the AltB
13600 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42  , AeqB, and AgtB
13610 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e   subroutines, an
13620 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77   EOF on A follow
13630 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75  ing nextA.** cau
13640 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  ses an immediate
13650 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e   jump to EofA an
13660 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f  d an EOF on B fo
13670 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61  llowing nextB ca
13680 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64  uses.** an immed
13690 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
136a0 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20  B.  Within EofA 
136b0 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f  and EofB, and EO
136c0 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a  F on entry or.**
136d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58   following nextX
136e0 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74   causes a jump t
136f0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
13700 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69   select processi
13710 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63  ng..**.** Duplic
13720 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74  ate removal in t
13730 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  he UNION, EXCEPT
13740 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20  , and INTERSECT 
13750 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64  cases is handled
13760 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f  .** within the o
13770 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
13780 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72  .  The regPrev r
13790 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64  egister set hold
137a0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  s the previously
137b0 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65  .** output value
137c0 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20  .  A comparison 
137d0 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20  is made against 
137e0 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74  this value and t
137f0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20  he output.** is 
13800 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e  skipped if the n
13810 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c  ext results woul
13820 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  d be the same as
13830 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a   the previous..*
13840 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
13850 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20  ntation plan is 
13860 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
13870 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
13880 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62  and seven.** sub
13890 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20  routines first, 
138a0 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e  then put the con
138b0 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68  trol logic at th
138c0 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20  e bottom.  Like 
138d0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
138e0 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a       goto Init.*
138f0 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75  *     coA: corou
13900 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75  tine for left qu
13910 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63  ery (A).**     c
13920 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oB: coroutine fo
13930 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42  r right query (B
13940 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75  ).**    outA: ou
13950 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
13960 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75  A.**    outB: ou
13970 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
13980 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49  B (UNION and UNI
13990 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20  ON ALL only).** 
139a0 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20     EofA: ....** 
139b0 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20     EofB: ....** 
139c0 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AltB: ....** 
139d0 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20     AeqB: ....** 
139e0 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AgtB: ....** 
139f0 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c     Init: initial
13a00 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65  ize coroutine re
13a10 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20  gisters.**      
13a20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a      yield coA.**
13a30 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
13a40 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a  (A) goto EofA.**
13a50 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
13a60 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coB.**          
13a70 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45  if eof(B) goto E
13a80 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20  ofB.**    Cmpr: 
13a90 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20  Compare A, B.** 
13aa0 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c           Jump Al
13ab0 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a  tB, AeqB, AgtB.*
13ac0 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a  *     End: ....*
13ad0 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74  *.** We call Alt
13ae0 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45  B, AeqB, AgtB, E
13af0 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73  ofA, and EofB "s
13b00 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20  ubroutines" but 
13b10 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  they are not.** 
13b20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20  actually called 
13b30 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20  using Gosub and 
13b40 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75  they do not Retu
13b50 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f  rn.  EofA and Eo
13b60 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c  fB loop.** until
13b70 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68   all data is exh
13b80 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70  austed then jump
13b90 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61   to the "end" la
13ba0 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c  be.  AltB, AeqB,
13bb0 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d  .** and AgtB jum
13bc0 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f  p to either L2 o
13bd0 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41  r to one of EofA
13be0 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 73 74 61   or EofB..*/.sta
13bf0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
13c00 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
13c10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
13c20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
13c30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
13c40 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
13c50 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
13c60 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
13c70 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
13c80 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
13c90 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
13ca0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
13cb0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
13cc0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
13cd0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
13ce0 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
13cf0 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
13d00 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
13d10 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
13d20 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
13d30 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
13d40 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
13d50 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
13d60 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
13d70 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
13d80 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
13d90 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
13da0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
13db0 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
13dc0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
13dd0 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
13de0 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
13df0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
13e00 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
13e10 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
13e20 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 41 3b 20  .  int regEofA; 
13e30 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
13e40 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65   to indicate whe
13e50 6e 20 73 65 6c 65 63 74 2d 41 20 69 73 20 63 6f  n select-A is co
13e60 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  mplete */.  int 
13e70 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20  regAddrB;       
13e80 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
13e90 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
13ea0 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -B coroutine */.
13eb0 20 20 69 6e 74 20 72 65 67 45 6f 66 42 3b 20 20    int regEofB;  
13ec0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
13ed0 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e  to indicate when
13ee0 20 73 65 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d   select-B is com
13ef0 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61  plete */.  int a
13f00 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20  ddrSelectA;     
13f10 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
13f20 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  he select-A coro
13f30 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
13f40 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20  ddrSelectB;     
13f50 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
13f60 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f  he select-B coro
13f70 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
13f80 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  egOutA;         
13f90 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
13fa0 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
13fb0 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  put-A subroutine
13fc0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
13fd0 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  B;          /* A
13fe0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
13ff0 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42  for the output-B
14000 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
14010 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20   int addrOutA;  
14020 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
14030 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
14040 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  A subroutine */.
14050 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 3b 20    int addrOutB; 
14060 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
14070 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ss of the output
14080 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
14090 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b  .  int addrEofA;
140a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
140b0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
140c0 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-A-exhausted su
140d0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
140e0 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20  t addrEofB;     
140f0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
14100 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65  f the select-B-e
14110 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
14120 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
14130 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAltB;         /
14140 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
14150 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A<B subroutine 
14160 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71  */.  int addrAeq
14170 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
14180 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d  dress of the A==
14190 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
141a0 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20    int addrAgtB; 
141b0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
141c0 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75  ss of the A>B su
141d0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
141e0 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20  t regLimitA;    
141f0 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
14200 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
14210 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  -A */.  int regL
14220 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a  imitB;        /*
14230 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
14240 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
14250 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20    int regPrev;  
14260 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e          /* A ran
14270 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ge of registers 
14280 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73  to hold previous
14290 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
142a0 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20   savedLimit;    
142b0 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
142c0 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a  e of p->iLimit *
142d0 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66  /.  int savedOff
142e0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76  set;      /* Sav
142f0 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
14300 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  Offset */.  int 
14310 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20  labelCmpr;      
14320 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
14330 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
14340 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
14350 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e  */.  int labelEn
14360 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  d;         /* La
14370 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20  bel for the end 
14380 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53  of the overall S
14390 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20  ELECT stmt */.  
143a0 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20  int j1;         
143b0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e        /* Jump in
143c0 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20  structions that 
143d0 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20  get retargetted 
143e0 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
143f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
14400 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f  e of TK_ALL, TK_
14410 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
14420 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a  , TK_INTERSECT *
14430 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
14440 79 44 75 70 3b 20 20 20 20 20 2f 2a 20 43 6f 6d  yDup;     /* Com
14450 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
14460 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
14470 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b  e removal */.  K
14480 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67  eyInfo *pKeyMerg
14490 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73  e;   /* Comparis
144a0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
144b0 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20  or merging rows 
144c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
144d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
144e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
144f0 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  n */.  ExprList 
14500 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20  *pOrderBy;   /* 
14510 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
14520 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72  use */.  int nOr
14530 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
14540 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
14550 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
14560 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
14570 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20  t *aPermute;    
14580 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
14590 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72  rom ORDER BY ter
145a0 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74  ms to result set
145b0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38   columns */.  u8
145c0 20 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20   NotUsed;       
145d0 20 20 20 20 2f 2a 20 44 75 6d 6d 79 20 76 61 72      /* Dummy var
145e0 69 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 61 73 73  iables */..  ass
145f0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
14600 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  !=0 );.  db = pP
14610 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
14620 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
14630 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
14640 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
14650 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71  .  labelEnd = sq
14660 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
14670 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d  el(v);.  labelCm
14680 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pr = sqlite3Vdbe
14690 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a  MakeLabel(v);...
146a0 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68    /* Patch up th
146b0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
146c0 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d  e.  */.  op = p-
146d0 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20  >op;  .  pPrior 
146e0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
146f0 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
14700 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
14710 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
14720 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74  rderBy;.  assert
14730 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ( pOrderBy );.  
14740 69 66 28 20 70 72 6f 63 65 73 73 43 6f 6d 70 6f  if( processCompo
14750 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72 73  undOrderBy(pPars
14760 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74  e, p) ){.    ret
14770 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
14780 3b 0a 20 20 7d 0a 20 20 6e 4f 72 64 65 72 42 79  ;.  }.  nOrderBy
14790 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
147a0 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70  pr;..  /* For op
147b0 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68  erators other th
147c0 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20  an UNION ALL we 
147d0 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  have to make sur
147e0 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  e that.  ** the 
147f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
14800 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72  covers every ter
14810 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
14820 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74  set.  Add.  ** t
14830 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45  erms to the ORDE
14840 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e  R BY clause as n
14850 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
14860 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20   if( op!=TK_ALL 
14870 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
14880 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14890 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c  ==0 && i<=p->pEL
148a0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
148b0 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  {.      for(j=0;
148c0 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b   j<nOrderBy; j++
148d0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
148e0 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42  *pTerm = pOrderB
148f0 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20  y->a[j].pExpr;. 
14900 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14910 54 65 72 6d 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Term->op==TK_INT
14920 45 47 45 52 20 29 3b 0a 20 20 20 20 20 20 20 20  EGER );.        
14930 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
14940 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
14950 6c 75 65 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  lue)!=0 );.     
14960 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 54     if( pTerm->iT
14970 61 62 6c 65 3d 3d 69 20 29 20 62 72 65 61 6b 3b  able==i ) break;
14980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14990 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29  f( j==nOrderBy )
149a0 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
149b0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45  pNew = sqlite3PE
149c0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
149d0 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 30 29  NTEGER, 0, 0, 0)
149e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
149f0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
14a00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
14a10 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
14a20 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
14a30 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
14a40 54 61 62 6c 65 20 3d 20 69 3b 0a 20 20 20 20 20  Table = i;.     
14a50 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71     pOrderBy = sq
14a60 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
14a70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64  end(pParse, pOrd
14a80 65 72 42 79 2c 20 70 4e 65 77 2c 20 30 29 3b 0a  erBy, pNew, 0);.
14a90 20 20 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79          nOrderBy
14aa0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
14ab0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  }.  }..  /* Comp
14ac0 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ute the comparis
14ad0 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61  on permutation a
14ae0 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20  nd keyinfo that 
14af0 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a  is used with.  *
14b00 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f  * the permutatio
14b10 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  n in order to co
14b20 6d 70 61 72 69 73 6f 6e 73 20 74 6f 20 64 65 74  mparisons to det
14b30 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65  ermine if the ne
14b40 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72  xt.  ** row of r
14b50 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f  esults comes fro
14b60 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c  m selectA or sel
14b70 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20  ectB.  Also add 
14b80 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f  explicit.  ** co
14b90 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  llations to the 
14ba0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
14bb0 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68  terms so that wh
14bc0 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69 65  en the subquerie
14bd0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69  s.  ** to the ri
14be0 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74  ght and the left
14bf0 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20   are evaluated, 
14c00 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f 72  they use the cor
14c10 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  rect.  ** collat
14c20 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72  ion..  */.  aPer
14c30 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62  mute = sqlite3Db
14c40 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
14c50 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65 72  zeof(int)*nOrder
14c60 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d  By);.  if( aPerm
14c70 75 74 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ute ){.    for(i
14c80 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
14c90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
14ca0 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72   *pTerm = pOrder
14cb0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
14cc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
14cd0 65 72 6d 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  erm->op==TK_INTE
14ce0 47 45 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  GER );.      ass
14cf0 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61  ert( (pTerm->fla
14d00 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
14d10 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 50  )!=0 );.      aP
14d20 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 54 65 72  ermute[i] = pTer
14d30 6d 2d 3e 69 54 61 62 6c 65 2d 31 3b 0a 20 20 20  m->iTable-1;.   
14d40 20 20 20 61 73 73 65 72 74 28 20 61 50 65 72 6d     assert( aPerm
14d50 75 74 65 5b 69 5d 3e 3d 30 20 26 26 20 61 50 65  ute[i]>=0 && aPe
14d60 72 6d 75 74 65 5b 69 5d 3c 70 2d 3e 70 45 4c 69  rmute[i]<p->pELi
14d70 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20  st->nExpr );.   
14d80 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65   }.    pKeyMerge
14d90 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   =.      sqlite3
14da0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
14db0 73 69 7a 65 6f 66 28 2a 70 4b 65 79 4d 65 72 67  sizeof(*pKeyMerg
14dc0 65 29 2b 6e 4f 72 64 65 72 42 79 2a 28 73 69 7a  e)+nOrderBy*(siz
14dd0 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
14de0 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 4d  );.    if( pKeyM
14df0 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 70 4b  erge ){.      pK
14e00 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72  eyMerge->aSortOr
14e10 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79  der = (u8*)&pKey
14e20 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72  Merge->aColl[nOr
14e30 64 65 72 42 79 5d 3b 0a 20 20 20 20 20 20 70 4b  derBy];.      pK
14e40 65 79 4d 65 72 67 65 2d 3e 6e 46 69 65 6c 64 20  eyMerge->nField 
14e50 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = nOrderBy;.    
14e60 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 65 6e 63    pKeyMerge->enc
14e70 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
14e80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
14e90 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
14ea0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
14eb0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70  oll;.        Exp
14ec0 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65  r *pTerm = pOrde
14ed0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
14ee0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
14ef0 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  rm->flags & EP_E
14f00 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  xpCollate ){.   
14f10 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
14f20 54 65 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Term->pColl;.   
14f30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14f40 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75        pColl = mu
14f50 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
14f60 28 70 50 61 72 73 65 2c 20 70 2c 20 61 50 65 72  (pParse, p, aPer
14f70 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  mute[i]);.      
14f80 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73      pTerm->flags
14f90 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
14fa0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  e;.          pTe
14fb0 72 6d 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  rm->pColl = pCol
14fc0 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  l;.        }.   
14fd0 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e       pKeyMerge->
14fe0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c  aColl[i] = pColl
14ff0 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65  ;.        pKeyMe
15000 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  rge->aSortOrder[
15010 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
15020 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
15030 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15040 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65  else{.    pKeyMe
15050 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rge = 0;.  }..  
15060 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20  /* Reattach the 
15070 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
15080 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  to the query..  
15090 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  */.  p->pOrderBy
150a0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
150b0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
150c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
150d0 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  tDup(pParse->db,
150e0 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 2f   pOrderBy);..  /
150f0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e  * Allocate a ran
15100 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  ge of temporary 
15110 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
15120 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64  e KeyInfo needed
15130 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f  .  ** for the lo
15140 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73  gic that removes
15150 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c   duplicate resul
15160 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a  t rows when the.
15170 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73    ** operator is
15180 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
15190 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75  or INTERSECT (bu
151a0 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29  t not UNION ALL)
151b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
151c0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
151d0 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65  egPrev = 0;.  }e
151e0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
151f0 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
15200 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  nExpr;.    asser
15210 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78  t( nOrderBy>=nEx
15220 70 72 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65  pr );.    regPre
15230 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  v = sqlite3GetTe
15240 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
15250 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 73 71  nExpr+1);.    sq
15260 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15270 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
15280 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
15290 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65  pKeyDup = sqlite
152a0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
152b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
152c0 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79      sizeof(*pKey
152d0 44 75 70 29 20 2b 20 6e 45 78 70 72 2a 28 73 69  Dup) + nExpr*(si
152e0 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
152f0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  ) );.    if( pKe
15300 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 70 4b  yDup ){.      pK
15310 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
15320 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 44 75  r = (u8*)&pKeyDu
15330 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  p->aColl[nExpr];
15340 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e  .      pKeyDup->
15350 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70 72 3b 0a  nField = nExpr;.
15360 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 65        pKeyDup->e
15370 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
15380 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
15390 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
153a0 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f      pKeyDup->aCo
153b0 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c  ll[i] = multiSel
153c0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
153d0 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
153e0 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
153f0 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  Order[i] = 0;.  
15400 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15410 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20   .  /* Separate 
15420 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65  the left and the
15430 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f   right query fro
15440 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20  m one another.  
15450 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
15460 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 52   0;.  pPrior->pR
15470 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20  ightmost = 0;.  
15480 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f 75  processOrderGrou
15490 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  pBy(pParse, p, p
154a0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 31 2c 20 26  ->pOrderBy, 1, &
154b0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
154c0 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d  pPrior->pPrior==
154d0 30 20 29 7b 0a 20 20 20 20 70 72 6f 63 65 73 73  0 ){.    process
154e0 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
154f0 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72  rse, pPrior, pPr
15500 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 31  ior->pOrderBy, 1
15510 2c 20 26 4e 6f 74 55 73 65 64 29 3b 0a 20 20 7d  , &NotUsed);.  }
15520 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
15530 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
15540 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  rs */.  computeL
15550 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
15560 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e  arse, p, labelEn
15570 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
15580 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c  mit && op==TK_AL
15590 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  L ){.    regLimi
155a0 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
155b0 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69  Mem;.    regLimi
155c0 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
155d0 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
155e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
155f0 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65  _Copy, p->iOffse
15600 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31  t ? p->iOffset+1
15610 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20   : p->iLimit,.  
15620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15640 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20  regLimitA);.    
15650 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15660 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  2(v, OP_Copy, re
15670 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69  gLimitA, regLimi
15680 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tB);.  }else{.  
15690 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65    regLimitA = re
156a0 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d  gLimitB = 0;.  }
156b0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
156c0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
156d0 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  it);.  p->pLimit
156e0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
156f0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
15700 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e  >pOffset);.  p->
15710 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  pOffset = 0;..  
15720 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61  regAddrA = ++pPa
15730 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
15740 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  EofA = ++pParse-
15750 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72  >nMem;.  regAddr
15760 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
15770 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20 3d 20  em;.  regEofB = 
15780 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
15790 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50    regOutA = ++pP
157a0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
157b0 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  gOutB = ++pParse
157c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
157d0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
157e0 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f  &destA, SRT_Coro
157f0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
15800 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
15810 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42  tDestInit(&destB
15820 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
15830 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
15840 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68 65 20  * Jump past the 
15850 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75 74 69  various subrouti
15860 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74 69 6e  nes and coroutin
15870 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20  es to the main. 
15880 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20   ** merge loop. 
15890 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74   */.  j1 = sqlit
158a0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
158b0 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64 64 72  OP_Goto);.  addr
158c0 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65  SelectA = sqlite
158d0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
158e0 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65  (v);...  /* Gene
158f0 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65  rate a coroutine
15900 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
15910 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
15920 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65  t to the.  ** le
15930 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ft of the compou
15940 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68  nd operator - th
15950 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20  e "A" select..  
15960 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
15970 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
15980 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
15990 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ft SELECT"));.  
159a0 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
159b0 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 73 71   regLimitA;.  sq
159c0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
159d0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
159e0 74 41 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  tA, 0, 0, 0);.  
159f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15a00 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
15a10 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20   1, regEofA);.  
15a20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15a30 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
15a40 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64 62 65  egAddrA);.  Vdbe
15a50 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
15a60 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66  "End coroutine f
15a70 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29  or left SELECT")
15a80 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
15a90 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
15aa0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
15ab0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
15ac0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68  n .  ** the righ
15ad0 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65  t - the "B" sele
15ae0 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  ct.  */.  addrSe
15af0 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56  lectB = sqlite3V
15b00 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
15b10 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  );.  VdbeNoopCom
15b20 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
15b30 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
15b40 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  ght SELECT"));. 
15b50 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d   savedLimit = p-
15b60 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64  >iLimit;.  saved
15b70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
15b80 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  set;.  p->iLimit
15b90 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20   = regLimitB;.  
15ba0 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20  p->iOffset = 0; 
15bb0 20 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63   .  sqlite3Selec
15bc0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
15bd0 73 74 42 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  stB, 0, 0, 0);. 
15be0 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76   p->iLimit = sav
15bf0 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f  edLimit;.  p->iO
15c00 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66  ffset = savedOff
15c10 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  set;.  sqlite3Vd
15c20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15c30 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f  nteger, 1, regEo
15c40 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fB);.  sqlite3Vd
15c50 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
15c60 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b  ield, regAddrB);
15c70 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
15c80 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f  nt((v, "End coro
15c90 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
15ca0 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a  SELECT"));..  /*
15cb0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
15cc0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
15cd0 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
15ce0 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a  row of the A.  *
15cf0 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
15d00 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
15d10 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
15d20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
15d30 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
15d40 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
15d50 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61  ne for A"));.  a
15d60 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61  ddrOutA = genera
15d70 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
15d80 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
15d90 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
15da0 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65  destA, pDest, re
15db0 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20  gOutA,.         
15dc0 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
15dd0 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59   pKeyDup, P4_KEY
15de0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2c 20 6c 61  INFO_HANDOFF, la
15df0 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a  belEnd);.  .  /*
15e00 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
15e10 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
15e20 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
15e30 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a  row of the B.  *
15e40 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
15e50 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
15e60 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
15e70 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69  select..  */.  i
15e80 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
15e90 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
15ea0 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
15eb0 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
15ec0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29   routine for B")
15ed0 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20  );.    addrOutB 
15ee0 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
15ef0 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
15f00 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
15f10 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70      p, &destB, p
15f20 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20  Dest, regOutB,. 
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
15f50 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41  , P4_KEYINFO_STA
15f60 54 49 43 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  TIC, labelEnd);.
15f70 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
15f80 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
15f90 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
15fa0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
15fb0 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65  ect A.  ** are e
15fc0 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
15fd0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
15fe0 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   B remains..  */
15ff0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
16000 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75  nt((v, "eof-A su
16010 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 69  broutine"));.  i
16020 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  f( op==TK_EXCEPT
16030 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
16040 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
16050 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64  EofA = sqlite3Vd
16060 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
16070 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64  oto, 0, labelEnd
16080 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20  );.  }else{  .  
16090 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
160a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
160b0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42  , OP_If, regEofB
160c0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
160d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
160e0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
160f0 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
16100 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B);.    sqlite3V
16110 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16120 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29  Yield, regAddrB)
16130 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16140 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
16150 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29  to, 0, addrEofA)
16160 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
16170 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
16180 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
16190 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
161a0 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65  elect B.  ** are
161b0 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
161c0 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
161d0 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct A remains..  
161e0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
161f0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
16200 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72   addrEofB = addr
16210 45 6f 66 41 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  EofA;.  }else{  
16220 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
16230 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20  ment((v, "eof-B 
16240 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
16250 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71     addrEofB = sq
16260 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16270 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
16280 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  A, labelEnd);.  
16290 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
162a0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
162b0 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
162c0 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
162d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
162e0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
162f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16300 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
16310 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42  oto, 0, addrEofB
16320 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
16330 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
16340 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
16350 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A<B.  */.  Vdbe
16360 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
16370 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-lt-B subrouti
16380 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74  ne"));.  addrAlt
16390 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
163a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
163b0 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
163c0 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  OutA);.  sqlite3
163d0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
163e0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
163f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16400 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
16410 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f   regEofA, addrEo
16420 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
16430 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
16440 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
16450 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
16460 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
16470 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
16480 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
16490 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
164a0 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
164b0 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
164c0 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
164d0 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
164e0 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
164f0 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
16500 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
16510 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
16520 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
16530 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
16540 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
16550 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
16560 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
16570 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
16580 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16590 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72  f, regEofA, addr
165a0 45 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  EofA);.    sqlit
165b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
165c0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
165d0 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
165e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
165f0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
16600 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
16610 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
16620 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
16630 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
16640 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
16650 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
16660 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
16670 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
16680 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
16690 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
166a0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
166b0 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
166c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
166d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
166e0 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20  ld, regAddrB);. 
166f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16700 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
16710 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  EofB, addrEofB);
16720 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16730 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
16740 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
16750 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
16760 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69  runs once to ini
16770 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69  tialize everythi
16780 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ng..  */.  sqlit
16790 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
167a0 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , j1);.  sqlite3
167b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
167c0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
167d0 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofA);.  sqlite3
167e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
167f0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
16800 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofB);.  sqlite3
16810 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16820 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41  _Gosub, regAddrA
16830 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a  , addrSelectA);.
16840 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16850 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
16860 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 53   regAddrB, addrS
16870 65 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74  electB);.  sqlit
16880 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16890 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
168a0 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c  addrEofA);.  sql
168b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
168c0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42  , OP_If, regEofB
168d0 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20  , addrEofB);..  
168e0 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65  /* Implement the
168f0 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70   main merge loop
16900 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
16910 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
16920 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  v, labelCmpr);. 
16930 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16940 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61  p4(v, OP_Permuta
16950 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28  tion, 0, 0, 0, (
16960 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20  char*)aPermute, 
16970 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20  P4_INTARRAY);.  
16980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16990 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
169a0 20 64 65 73 74 41 2e 69 4d 65 6d 2c 20 64 65 73   destA.iMem, des
169b0 74 42 2e 69 4d 65 6d 2c 20 6e 4f 72 64 65 72 42  tB.iMem, nOrderB
169c0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
169d0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
169e0 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34  r*)pKeyMerge, P4
169f0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
16a00 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16a10 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
16a20 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64  p, addrAltB, add
16a30 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29  rAeqB, addrAgtB)
16a40 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  ;..  /* Release 
16a50 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
16a60 65 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ers.  */.  if( r
16a70 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 73 71  egPrev ){.    sq
16a80 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16a90 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
16aa0 67 50 72 65 76 2c 20 6e 4f 72 64 65 72 42 79 2b  gPrev, nOrderBy+
16ab0 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75  1);.  }..  /* Ju
16ac0 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70  mp to the this p
16ad0 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  oint in order to
16ae0 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71   terminate the q
16af0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  uery..  */.  sql
16b00 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
16b10 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64  abel(v, labelEnd
16b20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
16b30 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
16b40 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  t columns.  */. 
16b50 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
16b60 74 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20  t==SRT_Callback 
16b70 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
16b80 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a  First = pPrior;.
16b90 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
16ba0 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
16bb0 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
16bc0 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74  ior;.    generat
16bd0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
16be0 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
16bf0 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
16c00 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68  /* Reassembly th
16c10 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
16c20 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
16c30 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63   be freed correc
16c40 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  tly.  ** by the 
16c50 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
16c60 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
16c70 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ior ){.    sqlit
16c80 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
16c90 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  b, p->pPrior);. 
16ca0 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d   }.  p->pPrior =
16cb0 20 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a   pPrior;..  /***
16cc0 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75   TBD:  Insert su
16cd0 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74  broutine calls t
16ce0 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20  o close cursors 
16cf0 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20  on incomplete.  
16d00 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20  **** subqueries 
16d10 2a 2a 2a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53  ****/.  return S
16d20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
16d30 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
16d40 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
16d50 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
16d60 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
16d70 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61   Forward Declara
16d80 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
16d90 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
16da0 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70  st(sqlite3*, Exp
16db0 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70  rList*, int, Exp
16dc0 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
16dd0 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
16de0 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63  (sqlite3*, Selec
16df0 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  t *, int, ExprLi
16e00 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63  st *);../*.** Sc
16e10 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
16e20 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
16e30 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
16e40 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
16e50 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
16e60 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
16e70 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
16e80 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
16e90 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
16ea0 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
16eb0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
16ec0 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
16ed0 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
16ee0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16ef0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
16f00 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
16f10 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
16f20 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
16f30 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
16f40 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
16f50 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
16f60 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
16f70 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
16f80 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
16f90 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
16fa0 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
16fb0 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
16fc0 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
16fd0 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
16fe0 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
16ff0 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
17000 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
17010 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
17020 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
17030 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
17040 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
17050 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
17060 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
17070 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28   void substExpr(
17080 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
17090 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
170a0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74   malloc errors t
170b0 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  o this connectio
170c0 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
170d0 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78  pr,        /* Ex
170e0 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73  pr in which subs
170f0 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  titution occurs 
17100 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
17110 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
17120 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
17130 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
17140 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
17150 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65  Substitute expre
17160 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssions */.){.  i
17170 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
17180 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
17190 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
171a0 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
171b0 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
171c0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
171d0 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
171e0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
171f0 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
17200 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
17210 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17220 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
17230 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
17240 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
17250 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
17260 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
17270 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26  pr->pRight==0 &&
17280 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
17290 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
172a0 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
172b0 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
172c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
172d0 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20  pNew!=0 );.     
172e0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65   pExpr->op = pNe
172f0 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73  w->op;.      ass
17300 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
17310 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  t==0 );.      pE
17320 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
17330 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
17340 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pNew->pLeft);.  
17350 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
17360 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
17370 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
17380 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
17390 72 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70  rDup(db, pNew->p
173a0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73  Right);.      as
173b0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69  sert( pExpr->pLi
173c0 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  st==0 );.      p
173d0 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71  Expr->pList = sq
173e0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
173f0 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 69 73 74  (db, pNew->pList
17400 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
17410 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69  iTable = pNew->i
17420 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 78  Table;.      pEx
17430 70 72 2d 3e 70 54 61 62 20 3d 20 70 4e 65 77 2d  pr->pTab = pNew-
17440 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 70 45 78  >pTab;.      pEx
17450 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e  pr->iColumn = pN
17460 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ew->iColumn;.   
17470 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
17480 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20   pNew->iAgg;.   
17490 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
174a0 6f 70 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e  opy(db, &pExpr->
174b0 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f  token, &pNew->to
174c0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ken);.      sqli
174d0 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c  te3TokenCopy(db,
174e0 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26   &pExpr->span, &
174f0 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  pNew->span);.   
17500 20 20 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63     pExpr->pSelec
17510 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
17520 74 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70  tDup(db, pNew->p
17530 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70  Select);.      p
17540 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e  Expr->flags = pN
17550 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ew->flags;.    }
17560 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
17570 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70  bstExpr(db, pExp
17580 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  r->pLeft, iTable
17590 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
175a0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78  ubstExpr(db, pEx
175b0 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  pr->pRight, iTab
175c0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
175d0 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
175e0 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c   pExpr->pSelect,
175f0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
17600 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
17610 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  ist(db, pExpr->p
17620 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
17630 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
17640 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
17650 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65  prList(.  sqlite
17660 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
17670 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
17680 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
17690 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
176a0 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f  ,     /* List to
176b0 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
176c0 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
176d0 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itutes */.  int 
176e0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
176f0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
17700 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
17710 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
17720 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
17730 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
17740 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
17750 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
17760 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
17770 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
17780 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  +){.    substExp
17790 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  r(db, pList->a[i
177a0 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
177b0 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
177c0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
177d0 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74  tSelect(.  sqlit
177e0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
177f0 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
17800 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
17810 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
17820 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
17830 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68   statement in wh
17840 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
17850 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  titutions */.  i
17860 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
17870 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
17880 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20  be replaced */. 
17890 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
178a0 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
178b0 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
178c0 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
178d0 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  rn;.  substExprL
178e0 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ist(db, p->pELis
178f0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
17900 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
17910 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  ist(db, p->pGrou
17920 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  pBy, iTable, pEL
17930 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
17940 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72  rList(db, p->pOr
17950 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  derBy, iTable, p
17960 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
17970 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  xpr(db, p->pHavi
17980 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ng, iTable, pELi
17990 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
179a0 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  (db, p->pWhere, 
179b0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
179c0 0a 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64  .  substSelect(d
179d0 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54  b, p->pPrior, iT
179e0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  able, pEList);.}
179f0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
17a00 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
17a10 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
17a20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
17a30 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20  T_VIEW) */..#if 
17a40 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
17a50 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
17a60 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
17a70 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a  E_OMIT_VIEW)./*.
17a80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17a90 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
17aa0 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69  ten subqueries i
17ab0 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64  n order to speed
17ac0 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  .** execution.  
17ad0 49 74 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  It returns 1 if 
17ae0 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
17af0 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
17b00 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72  ttening.** occur
17b10 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
17b20 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
17b30 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
17b40 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
17b50 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
17b60 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
17b70 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
17b80 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
17b90 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
17ba0 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
17bb0 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
17bc0 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
17bd0 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
17be0 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
17bf0 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
17c00 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
17c10 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
17c20 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
17c30 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
17c40 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
17c50 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
17c60 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
17c70 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
17c80 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
17c90 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
17ca0 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
17cb0 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
17cc0 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
17cd0 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
17ce0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
17cf0 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
17d00 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
17d10 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
17d20 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
17d30 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
17d40 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
17d50 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
17d60 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
17d70 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
17d80 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
17d90 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
17da0 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
17db0 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
17dc0 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63  or this simpific
17dd0 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
17de0 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
17df0 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
17e00 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
17e10 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
17e20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
17e30 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
17e40 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
17e50 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
17e60 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
17e70 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
17e80 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e  Flattening is on
17e90 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
17ea0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
17eb0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
17ec0 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20  *.**   (1)  The 
17ed0 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
17ee0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
17ef0 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67  not both use agg
17f00 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
17f10 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65   (2)  The subque
17f20 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
17f30 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75  regate or the ou
17f40 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
17f50 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
17f60 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65   (3)  The subque
17f70 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  ry is not the ri
17f80 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
17f90 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e   left outer join
17fa0 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 74  , or.**        t
17fb0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
17fc0 6f 74 20 69 74 73 65 6c 66 20 61 20 6a 6f 69 6e  ot itself a join
17fd0 2e 20 20 28 54 69 63 6b 65 74 20 23 33 30 36 29  .  (Ticket #306)
17fe0 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68  .**.**   (4)  Th
17ff0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
18000 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68  t DISTINCT or th
18010 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
18020 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
18030 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20 73 75  **   (5)  The su
18040 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
18050 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
18060 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
18070 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
18080 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
18090 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75  **   (6)  The su
180a0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
180b0 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
180c0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
180d0 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
180e0 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a     DISTINCT..**.
180f0 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75  **   (7)  The su
18100 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f  bquery has a FRO
18110 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
18120 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75    (8)  The subqu
18130 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
18140 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
18150 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
18160 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
18170 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65   (9)  The subque
18180 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
18190 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
181a0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
181b0 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
181c0 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
181d0 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62  *  (10)  The sub
181e0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
181f0 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
18200 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
18210 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20   does not.**    
18220 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a      use LIMIT..*
18230 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20  *.**  (11)  The 
18240 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
18250 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
18260 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52  not both have OR
18270 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a  DER BY clauses..
18280 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 54 68 65  **.**  (12)  The
18290 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
182a0 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
182b0 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
182c0 4a 4f 49 4e 20 6f 72 20 74 68 65 0a 2a 2a 20 20  JOIN or the.**  
182d0 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 68        subquery h
182e0 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
182f0 73 65 2e 20 20 28 61 64 64 65 64 20 62 79 20 74  se.  (added by t
18300 69 63 6b 65 74 20 23 33 35 30 29 0a 2a 2a 0a 2a  icket #350).**.*
18310 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62  *  (13)  The sub
18320 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20  query and outer 
18330 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
18340 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a  h use LIMIT.**.*
18350 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
18360 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
18370 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20  se OFFSET.**.** 
18380 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72   (15)  The outer
18390 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61   query is not pa
183a0 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rt of a compound
183b0 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a   select or the.*
183c0 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
183d0 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  y does not have 
183e0 62 6f 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59  both an ORDER BY
183f0 20 61 6e 64 20 61 20 4c 49 4d 49 54 20 63 6c 61   and a LIMIT cla
18400 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28  use..**        (
18410 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39  See ticket #2339
18420 29 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54  ).**.**  (16)  T
18430 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
18440 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
18450 74 65 20 6f 72 20 74 68 65 20 73 75 62 71 75 65  te or the subque
18460 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20  ry does.**      
18470 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52    not contain OR
18480 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74  DER BY.  (Ticket
18490 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73   #2942)  This us
184a0 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ed to not matter
184b0 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c  .**        until
184c0 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74   we introduced t
184d0 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  he group_concat(
184e0 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a  ) function.  .**
184f0 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20 73  .**  (17)  The s
18500 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20  ub-query is not 
18510 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
18520 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e  t, or it is a UN
18530 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20  ION ALL .**     
18540 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75     compound clau
18550 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72  se made up entir
18560 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65  ely of non-aggre
18570 67 61 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e  gate queries, an
18580 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65  d .**        the
18590 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a   parent query:.*
185a0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  *.**          * 
185b0 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61  is not itself pa
185c0 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rt of a compound
185d0 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20   select,.**     
185e0 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e       * is not an
185f0 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 44 49   aggregate or DI
18600 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e  STINCT query, an
18610 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  d.**          * 
18620 68 61 73 20 6e 6f 20 6f 74 68 65 72 20 74 61 62  has no other tab
18630 6c 65 73 20 6f 72 20 73 75 62 2d 73 65 6c 65 63  les or sub-selec
18640 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ts in the FROM c
18650 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lause..**.**    
18660 20 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61      The parent a
18670 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79  nd sub-query may
18680 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63   contain WHERE c
18690 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20  lauses. Subject 
186a0 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c  to.**        rul
186b0 65 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e  es (11), (13) an
186c0 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79  d (14), they may
186d0 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52   also contain OR
186e0 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20  DER BY,.**      
186f0 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53    LIMIT and OFFS
18700 45 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  ET clauses..**.*
18710 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
18720 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
18730 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
18740 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
18750 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
18760 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20  ORDER by clause 
18770 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
18780 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
18790 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
187a0 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
187b0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
187c0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f  **.** In this ro
187d0 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70  utine, the "p" p
187e0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
187f0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74  inter to the out
18800 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  er query..** The
18810 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e   subquery is p->
18820 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20  pSrc->a[iFrom]. 
18830 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69   isAgg is true i
18840 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
18850 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67  y.** uses aggreg
18860 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72  ates and subquer
18870 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69  yIsAgg is true i
18880 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
18890 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a  ses aggregates..
188a0 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  **.** If flatten
188b0 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ing is not attem
188c0 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  pted, this routi
188d0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e  ne is a no-op an
188e0 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20  d returns 0..** 
188f0 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
18900 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20   attempted this 
18910 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
18920 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  1..**.** All of 
18930 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
18940 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63  nalysis must occ
18950 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f  ur on both the o
18960 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a  uter query and.*
18970 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62  * the subquery b
18980 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
18990 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74  ne runs..*/.stat
189a0 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75  ic int flattenSu
189b0 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  bquery(.  Parse 
189c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
189d0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
189e0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
189f0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
18a00 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74  he parent or out
18a10 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  er SELECT statem
18a20 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ent */.  int iFr
18a30 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om,           /*
18a40 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72   Index in p->pSr
18a50 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e  c->a[] of the in
18a60 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ner subquery */.
18a70 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20    int isAgg,    
18a80 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
18a90 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75  f outer SELECT u
18aa0 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
18ab0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
18ac0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20   subqueryIsAgg  
18ad0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
18ae0 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
18af0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
18b00 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ns */.){.  const
18b10 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
18b20 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
18b30 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
18b40 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
18b50 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  nt;.  Select *pS
18b60 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ub;       /* The
18b70 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20   inner query or 
18b80 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20  "subquery" */.  
18b90 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20  Select *pSub1;  
18ba0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
18bb0 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  o the rightmost 
18bc0 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75  select in sub-qu
18bd0 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
18be0 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20   *pSrc;      /* 
18bf0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
18c00 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
18c10 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ry */.  SrcList 
18c20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54  *pSubSrc;   /* T
18c30 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
18c40 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
18c50 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
18c60 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72  ist;    /* The r
18c70 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
18c80 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
18c90 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20    int iParent;  
18ca0 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75        /* VDBE cu
18cb0 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
18cc0 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20 73  he pSub result s
18cd0 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  et temp table */
18ce0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
18cf0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
18d00 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72  ounter */.  Expr
18d10 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18d30 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
18d40 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
18d50 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69  List_item *pSubi
18d60 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75  tem;   /* The su
18d70 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69  bquery */.  sqli
18d80 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
18d90 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ->db;..  /* Chec
18da0 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74  k to see if flat
18db0 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
18dc0 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ted.  Return 0 i
18dd0 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  f not..  */.  if
18de0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
18df0 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  0;.  pSrc = p->p
18e00 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
18e10 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20  Src && iFrom>=0 
18e20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e  && iFrom<pSrc->n
18e30 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65  Src );.  pSubite
18e40 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72  m = &pSrc->a[iFr
18e50 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d  om];.  iParent =
18e60 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73   pSubitem->iCurs
18e70 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75  or;.  pSub = pSu
18e80 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
18e90 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d    assert( pSub!=
18ea0 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  0 );.  if( isAgg
18eb0 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
18ec0 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  g ) return 0;   
18ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18ee0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29   Restriction (1)
18ef0 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75    */.  if( subqu
18f00 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63  eryIsAgg && pSrc
18f10 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72  ->nSrc>1 ) retur
18f20 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
18f30 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29   Restriction (2)
18f40 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d    */.  pSubSrc =
18f50 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
18f60 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
18f70 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20  ;.  /* Prior to 
18f80 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77  version 3.1.2, w
18f90 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
18fa0 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73  FSET had to be s
18fb0 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c  imple constants,
18fc0 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72  .  ** not arbitr
18fd0 61 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73  ary expresssions
18fe0 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d  , we allowed som
18ff0 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c  e combining of L
19000 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
19010 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65    ** because the
19020 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75  y could be compu
19030 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ted at compile-t
19040 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c  ime.  But when L
19050 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
19060 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69    ** became arbi
19070 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
19080 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65  s, we were force
19090 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63  d to add restric
190a0 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20  tions (13).  ** 
190b0 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69  and (14). */.  i
190c0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
190d0 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  && p->pLimit ) r
190e0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
190f0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
19100 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69  tion (13) */.  i
19110 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74  f( pSub->pOffset
19120 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19140 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
19150 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69  tion (14) */.  i
19160 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  f( p->pRightmost
19170 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
19180 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
19190 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
191a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
191b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
191d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
191e0 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  5) */.  }.  if( 
191f0 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
19200 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19220 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
19230 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (7)  */.  if( 
19240 28 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63  (pSub->isDistinc
19250 74 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69  t || pSub->pLimi
19260 74 29 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  t) .         && 
19270 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c  (pSrc->nSrc>1 ||
19280 20 69 73 41 67 67 29 20 29 7b 20 20 20 20 20 20   isAgg) ){      
19290 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
192a0 6f 6e 73 20 28 34 29 28 35 29 28 38 29 28 39 29  ons (4)(5)(8)(9)
192b0 20 2a 2f 0a 20 20 20 20 20 72 65 74 75 72 6e 20   */.     return 
192c0 30 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a 20 20  0;       .  }.  
192d0 69 66 28 20 70 2d 3e 69 73 44 69 73 74 69 6e 63  if( p->isDistinc
192e0 74 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  t && subqueryIsA
192f0 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  gg ) return 0;  
19300 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
19310 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20  ction (6)  */.  
19320 69 66 28 20 28 70 2d 3e 64 69 73 61 6c 6c 6f 77  if( (p->disallow
19330 4f 72 64 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4f  OrderBy || p->pO
19340 72 64 65 72 42 79 29 20 26 26 20 70 53 75 62 2d  rderBy) && pSub-
19350 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
19360 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19390 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
193a0 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d  tion (11) */.  }
193b0 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
193c0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
193d0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
193e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
193f0 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f  triction (16) */
19400 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
19410 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
19420 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
19430 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
19440 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
19450 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
19460 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
19470 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
19480 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
19490 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
194a0 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
194b0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
194c0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
194d0 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
194e0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
194f0 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
19500 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
19510 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
19520 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
19530 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
19540 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
19550 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
19560 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
19570 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 53 72   */.  if( pSubSr
19580 63 2d 3e 6e 53 72 63 3e 31 20 26 26 20 28 70 53  c->nSrc>1 && (pS
19590 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
195a0 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
195b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
195c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
195d0 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74  iction 12:  If t
195e0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
195f0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
19600 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
19610 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65  .  ** join, make
19620 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
19630 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
19640 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20  clause..  ** An 
19650 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  examples of why 
19660 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  this is not allo
19670 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
19680 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
19690 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43  UTER JOIN (SELEC
196a0 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
196b0 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20  E t2.x>0).  **. 
196c0 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
196d0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
196e0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
196f0 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
19700 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
19710 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30  t2) WHERE t2.x>0
19720 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74  .  **.  ** But t
19730 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77  he t2.x>0 test w
19740 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
19750 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66  on a NULL row of
19760 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20   t2, which.  ** 
19770 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76  effectively conv
19780 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a  erts the OUTER J
19790 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45  OIN into an INNE
197a0 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2f 0a 20 20 69  R JOIN..  */.  i
197b0 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  f( (pSubitem->jo
197c0 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
197d0 52 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70  R)!=0 && pSub->p
197e0 57 68 65 72 65 21 3d 30 20 29 7b 0a 20 20 20 20  Where!=0 ){.    
197f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
19800 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
19810 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  17: If the sub-q
19820 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
19830 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
19840 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
19850 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
19860 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
19870 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
19880 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
19890 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
198a0 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
198b0 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
198c0 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
198d0 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
198e0 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
198f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
19900 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
19910 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 7c 7c 20  f( p->pPrior || 
19920 69 73 41 67 67 20 7c 7c 20 70 2d 3e 69 73 44 69  isAgg || p->isDi
19930 73 74 69 6e 63 74 20 7c 7c 20 70 53 72 63 2d 3e  stinct || pSrc->
19940 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  nSrc!=1 ){.     
19950 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
19960 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70  .    for(pSub1=p
19970 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62  Sub; pSub1; pSub
19980 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29  1=pSub1->pPrior)
19990 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 75 62  {.      if( pSub
199a0 31 2d 3e 69 73 41 67 67 20 7c 7c 20 70 53 75 62  1->isAgg || pSub
199b0 31 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 0a 20  1->isDistinct . 
199c0 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
199d0 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
199e0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20  ->op!=TK_ALL) . 
199f0 20 20 20 20 20 20 7c 7c 20 21 70 53 75 62 31 2d        || !pSub1-
19a00 3e 70 53 72 63 20 7c 7c 20 70 53 75 62 31 2d 3e  >pSrc || pSub1->
19a10 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 0a 20 20  pSrc->nSrc!=1.  
19a20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72      ){.        r
19a30 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
19a40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
19a50 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a  estriction 18. *
19a60 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72  /.    if( p->pOr
19a70 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
19a80 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72  nt ii;.      for
19a90 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72  (ii=0; ii<p->pOr
19aa0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  derBy->nExpr; ii
19ab0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
19ac0 72 20 2a 70 45 78 70 72 20 3d 20 70 2d 3e 70 4f  r *pExpr = p->pO
19ad0 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 70 45  rderBy->a[ii].pE
19ae0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
19af0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
19b00 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
19b10 69 54 61 62 6c 65 21 3d 69 50 61 72 65 6e 74 20  iTable!=iParent 
19b20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 72 65  ){ .          re
19b30 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
19b40 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
19b50 20 20 7d 0a 0a 20 20 70 50 61 72 73 65 2d 3e 7a    }..  pParse->z
19b60 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53  AuthContext = pS
19b70 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ubitem->zName;. 
19b80 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
19b90 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
19ba0 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
19bb0 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  );.  pParse->zAu
19bc0 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
19bd0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  edAuthContext;..
19be0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
19bf0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
19c00 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
19c10 6d 65 6e 74 2c 20 74 68 65 6e 20 69 74 20 6d 75  ment, then it mu
19c20 73 74 20 62 65 0a 20 20 2a 2a 20 61 20 55 4e 49  st be.  ** a UNI
19c30 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70  ON ALL and the p
19c40 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74  arent query must
19c50 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
19c60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
19c70 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
19c80 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
19c90 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
19ca0 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
19cb0 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
19cc0 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
19cd0 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
19ce0 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
19cf0 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 20  .  ** creates N 
19d00 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
19d10 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f  rent query witho
19d20 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  ut any ORDER BY,
19d30 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20   LIMIT or .  ** 
19d40 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61  OFFSET clauses a
19d50 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f  nd joins them to
19d60 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73   the left-hand-s
19d70 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ide of the origi
19d80 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55  nal.  ** using U
19d90 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
19da0 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
19db0 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
19dc0 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20   of simple.  ** 
19dd0 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
19de0 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s in the compoun
19df0 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a  d sub-query..  *
19e00 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75  /.  for(pSub=pSu
19e10 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b  b->pPrior; pSub;
19e20 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
19e30 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  or){.    Select 
19e40 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c  *pNew;.    ExprL
19e50 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
19e60 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
19e70 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20   Expr *pLimit = 
19e80 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45  p->pLimit;.    E
19e90 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70  xpr *pOffset = p
19ea0 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53  ->pOffset;.    S
19eb0 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20  elect *pPrior = 
19ec0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70  p->pPrior;.    p
19ed0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
19ee0 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b      p->pSrc = 0;
19ef0 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
19f00 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69   0;.    p->pLimi
19f10 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20  t = 0;.    pNew 
19f20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
19f30 75 70 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  up(db, p);.    p
19f40 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50  New->pPrior = pP
19f50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72  rior;.    p->pPr
19f60 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ior = pNew;.    
19f70 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
19f80 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 6f  rderBy;.    p->o
19f90 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20  p = TK_ALL;.    
19fa0 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
19fb0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
19fc0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70  pLimit;.    p->p
19fd0 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
19fe0 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d  ;.    p->pRightm
19ff0 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  ost = 0;.    pNe
1a000 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
1a010 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
1a020 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1a030 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 66 6c  int, it means fl
1a040 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
1a050 69 74 74 65 64 20 66 6f 72 20 74 68 65 0a 20 20  itted for the.  
1a060 2a 2a 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  ** iFrom-th entr
1a070 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
1a080 61 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 65  ause in the oute
1a090 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
1a0a0 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
1a0b0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1a0c0 3b 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d  ;.  for(pParent=
1a0d0 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72  p; pParent; pPar
1a0e0 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72  ent=pParent->pPr
1a0f0 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e  ior, pSub=pSub->
1a100 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74  pPrior){.    int
1a110 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53   nSubSrc = pSubS
1a120 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e  rc->nSrc;.    in
1a130 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  t jointype = 0;.
1a140 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53      pSubSrc = pS
1a150 75 62 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 53  ub->pSrc;.    pS
1a160 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
1a170 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 4d 6f 76 65  rc;..    /* Move
1a180 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d   all of the FROM
1a190 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
1a1a0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
1a1b0 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 46 52  he.    ** the FR
1a1c0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1a1d0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
1a1e0 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
1a1f0 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 20 20 2a  , remember.    *
1a200 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
1a210 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
1a220 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
1a230 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
1a240 0a 20 20 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  .    ** iParent.
1a250 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
1a260 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
1a270 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
1a280 75 65 6e 74 20 63 6f 64 65 0a 20 20 20 20 2a 2a  uent code.    **
1a290 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
1a2a0 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
1a2b0 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
1a2c0 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
1a2d0 65 0a 20 20 20 20 2a 2a 20 74 68 6f 73 65 20 72  e.    ** those r
1a2e0 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
1a2f0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
1a300 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
1a310 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 20  ubquery FROM.   
1a320 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
1a330 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
1a340 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  in..    */.    i
1a350 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20  f( pSrc ){.     
1a360 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72   pSubitem = &pSr
1a370 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 20  c->a[iFrom];.   
1a380 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75     nSubSrc = pSu
1a390 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20  bSrc->nSrc;.    
1a3a0 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75    jointype = pSu
1a3b0 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b  bitem->jointype;
1a3c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
1a3d0 6c 65 74 65 54 61 62 6c 65 28 70 53 75 62 69 74  leteTable(pSubit
1a3e0 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20  em->pTab);.     
1a3f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1a400 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  b, pSubitem->zDa
1a410 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 73  tabase);.      s
1a420 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a430 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1a440 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a450 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1a460 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1a470 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54      pSubitem->pT
1a480 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ab = 0;.      pS
1a490 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
1a4a0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 75  e = 0;.      pSu
1a4b0 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30  bitem->zName = 0
1a4c0 3b 0a 20 20 20 20 20 20 70 53 75 62 69 74 65 6d  ;.      pSubitem
1a4d0 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
1a4e0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 75 62    }.    if( nSub
1a4f0 53 72 63 21 3d 31 20 7c 7c 20 21 70 53 72 63 20  Src!=1 || !pSrc 
1a500 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74  ){.      int ext
1a510 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31  ra = nSubSrc - 1
1a520 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 28 70  ;.      for(i=(p
1a530 53 72 63 3f 31 3a 30 29 3b 20 69 3c 6e 53 75 62  Src?1:0); i<nSub
1a540 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
1a550 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65     pSrc = sqlite
1a560 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64  3SrcListAppend(d
1a570 62 2c 20 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a  b, pSrc, 0, 0);.
1a580 20 20 20 20 20 20 20 20 69 66 28 20 70 53 72 63          if( pSrc
1a590 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1a5a0 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
1a5b0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   0;.          re
1a5c0 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
1a5d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1a5e0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1a5f0 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28  pSrc;.      for(
1a600 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
1a610 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20  i-extra>=iFrom; 
1a620 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i--){.        pS
1a630 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d  rc->a[i] = pSrc-
1a640 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20  >a[i-extra];.   
1a650 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
1a660 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
1a670 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  c; i++){.      p
1a680 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
1a690 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
1a6a0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
1a6b0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c  SubSrc->a[i], 0,
1a6c0 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d   sizeof(pSubSrc-
1a6d0 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  >a[i]));.    }. 
1a6e0 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d     pSrc->a[iFrom
1a6f0 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
1a700 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
1a710 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
1a720 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
1a730 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
1a740 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
1a750 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
1a760 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
1a770 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1a780 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
1a790 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1a7a0 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
1a7b0 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
1a7c0 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
1a7d0 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
1a7e0 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
1a7f0 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1a810 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
1a820 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
1a830 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
1a840 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
1a850 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
1a860 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
1a870 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a880 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
1a890 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
1a8a0 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
1a8b0 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
1a8c0 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
1a8d0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
1a8e0 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
1a8f0 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
1a900 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
1a910 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
1a920 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
1a930 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20     */.    pList 
1a940 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  = pParent->pELis
1a950 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
1a960 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
1a970 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
1a980 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69   *pExpr;.      i
1a990 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
1a9a0 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70  Name==0 && (pExp
1a9b0 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
1a9c0 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d  pExpr)->span.z!=
1a9d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  0 ){.        pLi
1a9e0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
1a9f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1aa00 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
1aa10 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78  p(db, (char*)pEx
1aa20 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70  pr->span.z, pExp
1aa30 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  r->span.n);.    
1aa40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75    }.    }.    su
1aa50 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1aa60 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c  pParent->pEList,
1aa70 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1aa80 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
1aa90 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20   isAgg ){.      
1aaa0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1aab0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75  , pParent->pGrou
1aac0 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  pBy, iParent, pS
1aad0 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1aae0 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
1aaf0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1ab00 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
1ab10 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
1ab20 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1ab30 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1ab40 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1ab50 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
1ab60 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1ab70 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
1ab80 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
1ab90 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1aba0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
1abb0 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  f( pParent->pOrd
1abc0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 75  erBy ){.      su
1abd0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1abe0 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1abf0 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
1ac00 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
1ac10 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1ac20 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70  Where ){.      p
1ac30 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
1ac40 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
1ac50 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65  >pWhere);.    }e
1ac60 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72  lse{.      pWher
1ac70 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
1ac80 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
1ac90 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gg ){.      asse
1aca0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  rt( pParent->pHa
1acb0 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ving==0 );.     
1acc0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1acd0 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  g = pParent->pWh
1ace0 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
1acf0 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  nt->pWhere = pWh
1ad00 65 72 65 3b 0a 20 20 20 20 20 20 73 75 62 73 74  ere;.      subst
1ad10 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1ad20 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
1ad30 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1ad40 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1ad50 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
1ad60 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
1ad70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
1ad80 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ada0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1adb0 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
1adc0 76 69 6e 67 29 29 3b 0a 20 20 20 20 20 20 61 73  ving));.      as
1add0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1ade0 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
1adf0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72      pParent->pGr
1ae00 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
1ae10 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
1ae20 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  Sub->pGroupBy);.
1ae30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ae40 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1ae50 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20  Parent->pWhere, 
1ae60 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1ae70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  EList);.      pP
1ae80 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
1ae90 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
1aea0 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  b, pParent->pWhe
1aeb0 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20  re, pWhere);.   
1aec0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65   }.  .    /* The
1aed0 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
1aee0 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
1aef0 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
1af00 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
1af10 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
1af20 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a  stinct. .    */.
1af30 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 69 73 44      pParent->isD
1af40 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 65 6e  istinct = pParen
1af50 74 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 7c 7c  t->isDistinct ||
1af60 20 70 53 75 62 2d 3e 69 73 44 69 73 74 69 6e 63   pSub->isDistinc
1af70 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20  t;.  .    /*.   
1af80 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46   ** SELECT ... F
1af90 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
1afa0 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62  LIMIT a OFFSET b
1afb0 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54  ) LIMIT x OFFSET
1afc0 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   y;.    **.    *
1afd0 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64  * One is tempted
1afe0 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61   to try to add a
1aff0 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e   and b to combin
1b000 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42  e the limits.  B
1b010 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64  ut this.    ** d
1b020 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20  oes not work if 
1b030 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20  either limit is 
1b040 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f  negative..    */
1b050 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1b060 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70  Limit ){.      p
1b070 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d  Parent->pLimit =
1b080 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20   pSub->pLimit;. 
1b090 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69       pSub->pLimi
1b0a0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
1b0b0 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
1b0c0 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
1b0d0 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
1b0e0 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
1b0f0 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
1b100 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
1b110 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
1b120 62 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31  b1);..  return 1
1b130 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
1b140 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b150 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1b160 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1b170 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f  OMIT_VIEW) */../
1b180 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
1b190 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1b1a0 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
1b1b0 72 67 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69  rgument to see i
1b1c0 66 20 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69 6e  f it.** is a min
1b1d0 28 29 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72  () or max() quer
1b1e0 79 2e 20 52 65 74 75 72 6e 20 57 48 45 52 45 5f  y. Return WHERE_
1b1f0 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57  ORDERBY_MIN or W
1b200 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
1b210 20 69 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20 6f   if .** it is, o
1b220 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 41  r 0 otherwise. A
1b230 74 20 70 72 65 73 65 6e 74 2c 20 61 20 71 75 65  t present, a que
1b240 72 79 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ry is considered
1b250 20 74 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e 28   to be.** a min(
1b260 29 2f 6d 61 78 28 29 20 71 75 65 72 79 20 69 66  )/max() query if
1b270 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65  :.**.**   1. The
1b280 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 6f  re is a single o
1b290 62 6a 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f  bject in the FRO
1b2a0 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
1b2b0 20 20 32 2e 20 54 68 65 72 65 20 69 73 20 61 20    2. There is a 
1b2c0 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73 69 6f  single expressio
1b2d0 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
1b2e0 73 65 74 2c 20 61 6e 64 20 69 74 20 69 73 0a 2a  set, and it is.*
1b2f0 2a 20 20 20 20 20 20 65 69 74 68 65 72 20 6d 69  *      either mi
1b300 6e 28 78 29 20 6f 72 20 6d 61 78 28 78 29 2c 20  n(x) or max(x), 
1b310 77 68 65 72 65 20 78 20 69 73 20 61 20 63 6f 6c  where x is a col
1b320 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  umn reference..*
1b330 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 69 6e  /.static int min
1b340 4d 61 78 51 75 65 72 79 28 50 61 72 73 65 20 2a  MaxQuery(Parse *
1b350 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
1b360 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  p){.  Expr *pExp
1b370 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r;.  ExprList *p
1b380 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
1b390 74 3b 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74  t;..  if( pEList
1b3a0 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
1b3b0 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
1b3c0 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78 70  Y_NORMAL;.  pExp
1b3d0 72 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  r = pEList->a[0]
1b3e0 2e 70 45 78 70 72 3b 0a 20 20 70 45 4c 69 73 74  .pExpr;.  pEList
1b3f0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
1b400 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
1b410 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  !=TK_AGG_FUNCTIO
1b420 4e 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30 20 7c  N || pEList==0 |
1b430 7c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  | pEList->nExpr!
1b440 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
1b450 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30   if( pEList->a[0
1b460 5d 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ].pExpr->op!=TK_
1b470 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  AGG_COLUMN ) ret
1b480 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  urn WHERE_ORDERB
1b490 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28 20  Y_NORMAL;.  if( 
1b4a0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  pExpr->token.n!=
1b4b0 33 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45  3 ) return WHERE
1b4c0 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
1b4d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
1b4e0 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45  rNICmp((char*)pE
1b4f0 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 69  xpr->token.z,"mi
1b500 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  n",3)==0 ){.    
1b510 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44  return WHERE_ORD
1b520 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73  ERBY_MIN;.  }els
1b530 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
1b540 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 45 78  NICmp((char*)pEx
1b550 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 22 6d 61 78  pr->token.z,"max
1b560 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ",3)==0 ){.    r
1b570 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
1b580 52 42 59 5f 4d 41 58 3b 0a 20 20 7d 0a 20 20 72  RBY_MAX;.  }.  r
1b590 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
1b5a0 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 7d 0a 0a 2f  RBY_NORMAL;.}../
1b5b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b5c0 65 20 72 65 73 6f 6c 76 65 73 20 61 6e 79 20 6e  e resolves any n
1b5d0 61 6d 65 73 20 75 73 65 64 20 69 6e 20 74 68 65  ames used in the
1b5e0 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
1b5f0 68 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 53  he.** supplied S
1b600 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1b610 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   If the SELECT s
1b620 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 72  tatement being r
1b630 65 73 6f 6c 76 65 64 0a 2a 2a 20 69 73 20 61 20  esolved.** is a 
1b640 73 75 62 2d 73 65 6c 65 63 74 2c 20 74 68 65 6e  sub-select, then
1b650 20 70 4f 75 74 65 72 4e 43 20 69 73 20 61 20 70   pOuterNC is a p
1b660 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4e 61  ointer to the Na
1b670 6d 65 43 6f 6e 74 65 78 74 20 0a 2a 2a 20 6f 66  meContext .** of
1b680 20 74 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45   the parent SELE
1b690 43 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CT..*/.int sqlit
1b6a0 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
1b6b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1b6c0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
1b6d0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
1b6e0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b700 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1b710 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
1b720 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
1b730 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
1b740 54 68 65 20 6f 75 74 65 72 20 6e 61 6d 65 20 63  The outer name c
1b750 6f 6e 74 65 78 74 2e 20 4d 61 79 20 62 65 20 4e  ontext. May be N
1b760 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ULL. */.){.  Exp
1b770 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
1b780 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1b790 74 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20  t set. */.  int 
1b7a0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1b7b0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 2d 6c 6f         /* For-lo
1b7c0 6f 70 20 76 61 72 69 61 62 6c 65 20 75 73 65 64  op variable used
1b7d0 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61   in multiple pla
1b7e0 63 65 73 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ces */.  NameCon
1b7f0 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
1b800 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 6e 61 6d      /* Local nam
1b810 65 2d 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  e-context */.  E
1b820 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
1b830 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  y;        /* The
1b840 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
1b850 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
1b860 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 75  s routine has ru
1b870 6e 20 62 65 66 6f 72 65 2c 20 72 65 74 75 72 6e  n before, return
1b880 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f   immediately. */
1b890 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 6f  .  if( p->isReso
1b8a0 6c 76 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  lved ){.    asse
1b8b0 72 74 28 20 21 70 4f 75 74 65 72 4e 43 20 29 3b  rt( !pOuterNC );
1b8c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1b8d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  TE_OK;.  }.  p->
1b8e0 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 31 3b 0a  isResolved = 1;.
1b8f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68  .  /* If there h
1b900 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
1b910 20 65 72 72 6f 72 73 2c 20 64 6f 20 6e 6f 74 68   errors, do noth
1b920 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ing. */.  if( pP
1b930 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a  arse->nErr>0 ){.
1b940 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b950 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
1b960 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 73  /* Prepare the s
1b970 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 2e  elect statement.
1b980 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20   This call will 
1b990 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 63 75 72  allocate all cur
1b9a0 73 6f 72 73 0a 20 20 2a 2a 20 72 65 71 75 69 72  sors.  ** requir
1b9b0 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
1b9c0 20 74 61 62 6c 65 73 20 61 6e 64 20 73 75 62 71   tables and subq
1b9d0 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
1b9e0 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a  OM clause..  */.
1b9f0 20 20 69 66 28 20 70 72 65 70 53 65 6c 65 63 74    if( prepSelect
1ba00 53 74 6d 74 28 70 50 61 72 73 65 2c 20 70 29 20  Stmt(pParse, p) 
1ba10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1ba20 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1ba30 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68  .  /* Resolve th
1ba40 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
1ba50 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
1ba60 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54  FFSET clauses. T
1ba70 68 65 73 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  hese.  ** are no
1ba80 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66  t allowed to ref
1ba90 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c  er to any names,
1baa0 20 73 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74   so pass an empt
1bab0 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20  y NameContext.. 
1bac0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e   */.  memset(&sN
1bad0 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
1bae0 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  ));.  sNC.pParse
1baf0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28   = pParse;.  if(
1bb00 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
1bb10 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
1bb20 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20  ->pLimit) ||.   
1bb30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 52 65     sqlite3ExprRe
1bb40 73 6f 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c  solveNames(&sNC,
1bb50 20 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a   p->pOffset) ){.
1bb60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bb70 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
1bb80 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f  /* Set up the lo
1bb90 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  cal name-context
1bba0 20 74 6f 20 70 61 73 73 20 74 6f 20 45 78 70 72   to pass to Expr
1bbb0 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 74  ResolveNames() t
1bbc0 6f 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74  o.  ** resolve t
1bbd0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  he expression-li
1bbe0 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 4e 43 2e 61  st..  */.  sNC.a
1bbf0 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 73  llowAgg = 1;.  s
1bc00 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d  NC.pSrcList = p-
1bc10 3e 70 53 72 63 3b 0a 20 20 73 4e 43 2e 70 4e 65  >pSrc;.  sNC.pNe
1bc20 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 0a  xt = pOuterNC;..
1bc30 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
1bc40 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  es in the result
1bc50 20 73 65 74 2e 20 2a 2f 0a 20 20 70 45 4c 69 73   set. */.  pELis
1bc60 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
1bc70 20 69 66 28 20 21 70 45 4c 69 73 74 20 29 20 72   if( !pEList ) r
1bc80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1bc90 4f 52 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  OR;.  for(i=0; i
1bca0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
1bcb0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
1bcc0 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  pX = pEList->a[i
1bcd0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
1bce0 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
1bcf0 6c 76 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  lveNames(&sNC, p
1bd00 58 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  X) ){.      retu
1bd10 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1bd20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1bd30 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1bd40 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1bd50 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  ions in the resu
1bd60 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47  lt-set, and no G
1bd70 52 4f 55 50 20 42 59 20 0a 20 20 2a 2a 20 65 78  ROUP BY .  ** ex
1bd80 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74  pression, do not
1bd90 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65   allow aggregate
1bda0 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20  s in any of the 
1bdb0 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
1bdc0 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
1bdd0 28 20 21 70 2d 3e 69 73 41 67 67 20 29 3b 0a 20  ( !p->isAgg );. 
1bde0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
1bdf0 47 72 6f 75 70 42 79 3b 0a 20 20 69 66 28 20 70  GroupBy;.  if( p
1be00 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68  GroupBy || sNC.h
1be10 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 2d 3e  asAgg ){.    p->
1be20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 65 6c  isAgg = 1;.  }el
1be30 73 65 7b 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f  se{.    sNC.allo
1be40 77 41 67 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  wAgg = 0;.  }.. 
1be50 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20   /* If a HAVING 
1be60 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e  clause is presen
1be70 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  t, then there mu
1be80 73 74 20 62 65 20 61 20 47 52 4f 55 50 20 42 59  st be a GROUP BY
1be90 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
1bea0 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26  if( p->pHaving &
1beb0 26 20 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  & !pGroupBy ){. 
1bec0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1bed0 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52  sg(pParse, "a GR
1bee0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
1bef0 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
1bf00 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 72   HAVING");.    r
1bf10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1bf20 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  OR;.  }..  /* Ad
1bf30 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
1bf40 20 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d   list to the nam
1bf50 65 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65  e-context before
1bf60 20 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 2a   parsing the.  *
1bf70 2a 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  * other expressi
1bf80 6f 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ons in the SELEC
1bf90 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  T statement. Thi
1bfa0 73 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20 2a  s is so that.  *
1bfb0 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
1bfc0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1bfd0 65 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66  e (etc.) can ref
1bfe0 65 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e  er to expression
1bff0 73 20 62 79 0a 20 20 2a 2a 20 61 6c 69 61 73 65  s by.  ** aliase
1c000 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
1c010 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  set..  **.  ** M
1c020 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74  inor point: If t
1c030 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
1c040 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
1c050 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a  sion will be.  *
1c060 2a 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66  * re-evaluated f
1c070 6f 72 20 65 61 63 68 20 72 65 66 65 72 65 6e 63  or each referenc
1c080 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  e to it..  */.  
1c090 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e  sNC.pEList = p->
1c0a0 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 73 71  pEList;.  if( sq
1c0b0 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
1c0c0 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
1c0d0 57 68 65 72 65 29 20 7c 7c 0a 20 20 20 20 20 73  Where) ||.     s
1c0e0 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
1c0f0 65 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  eNames(&sNC, p->
1c100 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20 20 20  pHaving) ){.    
1c110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1c120 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROR;.  }.  if( p
1c130 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
1c140 20 20 20 69 66 28 20 70 72 6f 63 65 73 73 4f 72     if( processOr
1c150 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
1c160 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
1c170 79 2c 20 31 2c 20 26 73 4e 43 2e 68 61 73 41 67  y, 1, &sNC.hasAg
1c180 67 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  g) ){.      retu
1c190 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1c1a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1c1b0 20 70 72 6f 63 65 73 73 4f 72 64 65 72 47 72 6f   processOrderGro
1c1c0 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
1c1d0 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 26 73 4e  pGroupBy, 0, &sN
1c1e0 43 2e 68 61 73 41 67 67 29 20 29 7b 0a 20 20 20  C.hasAgg) ){.   
1c1f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1c200 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1c210 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1c220 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1c230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1c240 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
1c250 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 47 52  Make sure the GR
1c260 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f  OUP BY clause do
1c270 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
1c280 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1c290 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
1c2a0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73  GroupBy ){.    s
1c2b0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1c2c0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20  tem *pItem;.  . 
1c2d0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
1c2e0 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69  m=pGroupBy->a; i
1c2f0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
1c300 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1c310 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1c320 61 73 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d  asProperty(pItem
1c330 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29  ->pExpr, EP_Agg)
1c340 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1c350 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1c360 73 65 2c 20 22 61 67 67 72 65 67 61 74 65 20 66  se, "aggregate f
1c370 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  unctions are not
1c380 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20   allowed in ".  
1c390 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 47            "the G
1c3a0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 22 29  ROUP BY clause")
1c3b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1c3c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1c3d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c3e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1c3f0 73 20 6f 6e 65 20 53 45 4c 45 43 54 20 6f 66 20  s one SELECT of 
1c400 61 20 63 6f 6d 70 6f 75 6e 64 2c 20 62 65 20 73  a compound, be s
1c410 75 72 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 6e  ure to resolve n
1c420 61 6d 65 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ames.  ** in the
1c430 20 6f 74 68 65 72 20 53 45 4c 45 43 54 73 2e 0a   other SELECTs..
1c440 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
1c450 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rior ){.    retu
1c460 72 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  rn sqlite3Select
1c470 52 65 73 6f 6c 76 65 28 70 50 61 72 73 65 2c 20  Resolve(pParse, 
1c480 70 2d 3e 70 50 72 69 6f 72 2c 20 70 4f 75 74 65  p->pPrior, pOute
1c490 72 4e 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rNC);.  }else{. 
1c4a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c4b0 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
1c4c0 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72  * Reset the aggr
1c4d0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
1c4e0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67  r..**.** The agg
1c4f0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
1c500 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d  or is a set of m
1c510 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74  emory cells that
1c520 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65   hold.** interme
1c530 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68  diate results wh
1c540 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  ile calculating 
1c550 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54  an aggregate.  T
1c560 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73  his.** routine s
1c570 69 6d 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c  imply stores NUL
1c580 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f  Ls in all of tho
1c590 73 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e  se memory cells.
1c5a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c5b0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
1c5c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c5d0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1c5e0 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
1c5f0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1c600 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1c610 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
1c620 46 75 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67  Func;.  if( pAgg
1c630 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67  Info->nFunc+pAgg
1c640 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30  Info->nColumn==0
1c650 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1c660 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1c670 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
1c680 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  mn; i++){.    sq
1c690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c6a0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
1c6b0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
1c6c0 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f  .iMem);.  }.  fo
1c6d0 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f  r(pFunc=pAggInfo
1c6e0 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c  ->aFunc, i=0; i<
1c6f0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1c700 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a   i++, pFunc++){.
1c710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c720 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1c730 2c 20 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d  , 0, pFunc->iMem
1c740 29 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  );.    if( pFunc
1c750 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
1c760 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
1c770 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
1c780 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70  .      if( pE->p
1c790 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  List==0 || pE->p
1c7a0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
1c7b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c7c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1c7d0 2c 20 22 44 49 53 54 49 4e 43 54 20 69 6e 20 61  , "DISTINCT in a
1c7e0 67 67 72 65 67 61 74 65 20 6d 75 73 74 20 62 65  ggregate must be
1c7f0 20 66 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20 20   followed ".    
1c800 20 20 20 20 20 20 20 22 62 79 20 61 6e 20 65 78         "by an ex
1c810 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20  pression");.    
1c820 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
1c830 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
1c840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c850 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1c860 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
1c870 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1c880 70 45 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pE->pList);.    
1c890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c8a0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
1c8b0 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
1c8c0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
1c8d0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
1c8f0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
1c900 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
1c910 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1c920 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
1c930 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46  voke the OP_AggF
1c940 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66  inalize opcode f
1c950 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61  or every aggrega
1c960 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  te function.** i
1c970 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  n the AggInfo st
1c980 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
1c990 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  ic void finalize
1c9a0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72  AggFunctions(Par
1c9b0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
1c9c0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
1c9d0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1c9e0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1c9f0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
1ca00 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
1ca10 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
1ca20 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
1ca30 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
1ca40 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
1ca50 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1ca60 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c   = pF->pExpr->pL
1ca70 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ist;.    sqlite3
1ca80 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1ca90 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69  _AggFinal, pF->i
1caa0 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69  Mem, pList ? pLi
1cab0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30  st->nExpr : 0, 0
1cac0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cad0 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
1cae0 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
1caf0 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  CDEF);.  }.}../*
1cb00 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61  .** Update the a
1cb10 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72  ccumulator memor
1cb20 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61  y cells for an a
1cb30 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f  ggregate based o
1cb40 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
1cb50 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
1cb60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1cb70 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
1cb80 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
1cb90 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
1cba0 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
1cbb0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1cbc0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1cbd0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
1cbe0 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67  *pF;.  struct Ag
1cbf0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a  gInfo_col *pC;..
1cc00 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
1cc10 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f  ctMode = 1;.  fo
1cc20 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
1cc30 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
1cc40 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
1cc50 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e  +, pF++){.    in
1cc60 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  t nArg;.    int 
1cc70 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20  addrNext = 0;.  
1cc80 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20    int regAgg;.  
1cc90 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1cca0 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70  t = pF->pExpr->p
1ccb0 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  List;.    if( pL
1ccc0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72  ist ){.      nAr
1ccd0 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  g = pList->nExpr
1cce0 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
1ccf0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
1cd00 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72  ange(pParse, nAr
1cd10 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
1cd20 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
1cd30 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  t(pParse, pList,
1cd40 20 72 65 67 41 67 67 2c 20 30 29 3b 0a 20 20 20   regAgg, 0);.   
1cd50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
1cd60 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  rg = 0;.      re
1cd70 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  gAgg = 0;.    }.
1cd80 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
1cd90 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
1cda0 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
1cdb0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1cdc0 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  l(v);.      asse
1cdd0 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
1cde0 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
1cdf0 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44  t(pParse, pF->iD
1ce00 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78  istinct, addrNex
1ce10 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20  t, 1, regAgg);. 
1ce20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
1ce30 3e 70 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c  >pFunc->needColl
1ce40 53 65 71 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  Seq ){.      Col
1ce50 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
1ce60 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
1ce70 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1ce80 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  em;.      int j;
1ce90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1cea0 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70  List!=0 );  /* p
1ceb0 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70  List!=0 if pF->p
1cec0 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65  Func->needCollSe
1ced0 71 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 20  q is true */.   
1cee0 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
1cef0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f  m=pList->a; !pCo
1cf00 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b  ll && j<nArg; j+
1cf10 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1cf20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1cf30 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1cf40 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
1cf50 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
1cf60 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
1cf70 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
1cf80 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
1cf90 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
1cfa0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
1cfb0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1cfc0 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30  CollSeq, 0, 0, 0
1cfd0 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
1cfe0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
1cff0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1d000 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1d010 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41  AggStep, 0, regA
1d020 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20  gg, pF->iMem,.  
1d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d040 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
1d050 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
1d060 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1d070 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 6e 41  beChangeP5(v, nA
1d080 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
1d090 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
1d0a0 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
1d0b0 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
1d0c0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1d0d0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1d0e0 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
1d0f0 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65  ;.    if( addrNe
1d100 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  xt ){.      sqli
1d110 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1d120 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29  bel(v, addrNext)
1d130 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
1d140 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
1d150 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
1d160 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
1d170 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
1d180 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1d190 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
1d1a0 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
1d1b0 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
1d1c0 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
1d1d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1d1e0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
1d1f0 20 67 69 76 65 6e 20 53 45 4c 45 43 54 20 73 74   given SELECT st
1d200 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  atement..**.** T
1d210 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64  he results are d
1d220 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61  istributed in va
1d230 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e  rious ways depen
1d240 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63  ding on the.** c
1d250 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53  ontents of the S
1d260 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74  electDest struct
1d270 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ure pointed to b
1d280 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74  y argument pDest
1d290 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  .** as follows:.
1d2a0 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d  **.**     pDest-
1d2b0 3e 65 44 65 73 74 20 20 20 20 52 65 73 75 6c 74  >eDest    Result
1d2c0 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  .**     --------
1d2d0 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
1d2e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d2f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d300 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43  ---.**     SRT_C
1d310 61 6c 6c 62 61 63 6b 20 20 20 20 49 6e 76 6f 6b  allback    Invok
1d320 65 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  e the callback f
1d330 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74  or each row of t
1d340 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
1d350 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20       SRT_Mem    
1d360 20 20 20 20 20 53 74 6f 72 65 20 66 69 72 73 74       Store first
1d370 20 72 65 73 75 6c 74 20 69 6e 20 6d 65 6d 6f 72   result in memor
1d380 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50  y cell pDest->iP
1d390 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  arm.**.**     SR
1d3a0 54 5f 53 65 74 20 20 20 20 20 20 20 20 20 53 74  T_Set         St
1d3b0 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 6b  ore results as k
1d3c0 65 79 73 20 6f 66 20 74 61 62 6c 65 20 70 44 65  eys of table pDe
1d3d0 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20  st->iParm. .**  
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3f0 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66     Apply the aff
1d400 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66  inity pDest->aff
1d410 69 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74 6f  inity before sto
1d420 72 69 6e 67 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  ring them..**.**
1d430 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20       SRT_Union  
1d440 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
1d450 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61  ts as a key in a
1d460 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1d470 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
1d480 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63  *.**     SRT_Exc
1d490 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20  ept      Remove 
1d4a0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65  results from the
1d4b0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1d4c0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
1d4d0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62  *.**     SRT_Tab
1d4e0 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  le       Store r
1d4f0 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72  esults in tempor
1d500 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
1d510 3e 69 50 61 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  >iParm.**.**    
1d520 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20 20   SRT_EphemTab   
1d530 20 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70 6f   Create an tempo
1d540 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
1d550 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73 74 6f 72  ->iParm and stor
1d560 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1d570 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65 73           the res
1d580 75 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20 63  ult there. The c
1d590 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f 70  ursor is left op
1d5a0 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20  en after.**     
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
1d5d0 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74 69       SRT_Corouti
1d5e0 6e 65 20 20 20 49 6e 76 6f 6b 65 20 61 20 63 6f  ne   Invoke a co
1d5f0 2d 72 6f 75 74 69 6e 65 20 74 6f 20 63 6f 6d 70  -routine to comp
1d600 75 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  ute a single row
1d610 20 6f 66 20 0a 2a 2a 20 20 20 20 20 20 20 20 20   of .**         
1d620 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
1d630 72 65 73 75 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 20  result.**.**    
1d640 20 53 52 54 5f 45 78 69 73 74 73 20 20 20 20 20   SRT_Exists     
1d650 20 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65   Store a 1 in me
1d660 6d 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d  mory cell pDest-
1d670 3e 69 50 61 72 6d 20 69 66 20 74 68 65 20 72 65  >iParm if the re
1d680 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  sult.**         
1d690 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
1d6a0 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a  is not empty..**
1d6b0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69 73 63  .**     SRT_Disc
1d6c0 61 72 64 20 20 20 20 20 54 68 72 6f 77 20 74 68  ard     Throw th
1d6d0 65 20 72 65 73 75 6c 74 73 20 61 77 61 79 2e 0a  e results away..
1d6e0 2a 2a 0a 2a 2a 20 53 65 65 20 74 68 65 20 73 65  **.** See the se
1d6f0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20  lectInnerLoop() 
1d700 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 20 63  function for a c
1d710 61 6e 6f 6e 69 63 61 6c 20 6c 69 73 74 69 6e 67  anonical listing
1d720 20 6f 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f   of the .** allo
1d730 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 65 44  wed values of eD
1d740 65 73 74 20 61 6e 64 20 74 68 65 69 72 20 6d 65  est and their me
1d750 61 6e 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  anings..**.** Th
1d760 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1d770 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
1d780 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79   errors.  If any
1d790 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65   errors are.** e
1d7a0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
1d7b0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
1d7c0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
1d7d0 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72   left in.** pPar
1d7e0 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a  se->zErrMsg..**.
1d7f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d800 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68  does NOT free th
1d810 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  e Select structu
1d820 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54  re passed in.  T
1d830 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75  he.** calling fu
1d840 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  nction needs to 
1d850 64 6f 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 54  do that..**.** T
1d860 68 65 20 70 50 61 72 65 6e 74 2c 20 70 61 72 65  he pParent, pare
1d870 6e 74 54 61 62 2c 20 61 6e 64 20 2a 70 50 61 72  ntTab, and *pPar
1d880 65 6e 74 41 67 67 20 66 69 65 6c 64 73 20 61 72  entAgg fields ar
1d890 65 20 66 69 6c 6c 65 64 20 69 6e 20 69 66 20 74  e filled in if t
1d8a0 68 69 73 0a 2a 2a 20 53 45 4c 45 43 54 20 69 73  his.** SELECT is
1d8b0 20 61 20 73 75 62 71 75 65 72 79 2e 20 20 54 68   a subquery.  Th
1d8c0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 74  is routine may t
1d8d0 72 79 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  ry to combine th
1d8e0 69 73 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74  is SELECT.** wit
1d8f0 68 20 69 74 73 20 70 61 72 65 6e 74 20 74 6f 20  h its parent to 
1d900 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 66 6c  form a single fl
1d910 61 74 20 71 75 65 72 79 2e 20 20 49 6e 20 73 6f  at query.  In so
1d920 20 64 6f 69 6e 67 2c 20 69 74 20 6d 69 67 68 74   doing, it might
1d930 0a 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 70  .** change the p
1d940 61 72 65 6e 74 20 71 75 65 72 79 20 66 72 6f 6d  arent query from
1d950 20 61 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65   a non-aggregate
1d960 20 74 6f 20 61 6e 20 61 67 67 72 65 67 61 74 65   to an aggregate
1d970 20 71 75 65 72 79 2e 0a 2a 2a 20 46 6f 72 20 74   query..** For t
1d980 68 61 74 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  hat reason, the 
1d990 70 50 61 72 65 6e 74 41 67 67 20 66 6c 61 67 20  pParentAgg flag 
1d9a0 69 73 20 70 61 73 73 65 64 20 61 73 20 61 20 70  is passed as a p
1d9b0 6f 69 6e 74 65 72 2c 20 73 6f 20 69 74 0a 2a 2a  ointer, so it.**
1d9c0 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 2e   can be changed.
1d9d0 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
1d9e0 3a 20 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  :   The meaning 
1d9f0 6f 66 20 74 68 65 20 70 50 61 72 65 6e 74 20 70  of the pParent p
1da00 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
1da10 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1da20 20 74 31 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54   t1 JOIN (SELECT
1da30 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f   x, count(*) FRO
1da40 4d 20 74 32 29 20 4a 4f 49 4e 20 74 33 3b 0a 2a  M t2) JOIN t3;.*
1da50 2a 20 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  *    \          
1da60 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
1da70 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f 5f  ____ subquery __
1da80 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 2f 0a  _____/        /.
1da90 2a 2a 20 20 20 20 20 5c 20 20 20 20 20 20 20 20  **     \        
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
1dad0 2a 2a 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f  **      \_______
1dae0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
1daf0 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
1db00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
1db10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1db20 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
1db30 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1db40 66 69 72 73 74 2e 20 20 20 46 6f 72 20 74 68 61  first.   For tha
1db50 74 20 63 61 6c 6c 2c 0a 2a 2a 20 70 50 61 72 65  t call,.** pPare
1db60 6e 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 2e  nt will be NULL.
1db70 20 20 44 75 72 69 6e 67 20 74 68 65 20 70 72 6f    During the pro
1db80 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 6f  cessing of the o
1db90 75 74 65 72 20 71 75 65 72 79 2c 20 74 68 69 73  uter query, this
1dba0 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20   .** routine is 
1dbb0 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
1dbc0 6c 79 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ly to handle the
1dbd0 20 73 75 62 71 75 65 72 79 2e 20 20 46 6f 72 20   subquery.  For 
1dbe0 74 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  the recursive.**
1dbf0 20 63 61 6c 6c 2c 20 70 50 61 72 65 6e 74 20 77   call, pParent w
1dc00 69 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ill point to the
1dc10 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
1dc20 65 63 61 75 73 65 20 74 68 65 20 73 75 62 71 75  ecause the subqu
1dc30 65 72 79 20 69 73 0a 2a 2a 20 74 68 65 20 73 65  ery is.** the se
1dc40 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 69 6e 20  cond element in 
1dc50 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
1dc60 2c 20 74 68 65 20 70 61 72 65 6e 74 54 61 62 20  , the parentTab 
1dc70 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 0a 2a  parameter will.*
1dc80 2a 20 62 65 20 31 20 28 74 68 65 20 32 6e 64 20  * be 1 (the 2nd 
1dc90 76 61 6c 75 65 20 6f 66 20 61 20 30 2d 69 6e 64  value of a 0-ind
1dca0 65 78 65 64 20 61 72 72 61 79 2e 29 0a 2a 2f 0a  exed array.).*/.
1dcb0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
1dcc0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
1dcd0 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
1dce0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
1dcf0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
1dd00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1dd10 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
1dd20 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
1dd30 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  d. */.  SelectDe
1dd40 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 2f  st *pDest,     /
1dd50 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
1dd60 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  h the query resu
1dd70 6c 74 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  lts */.  Select 
1dd80 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20  *pParent,       
1dd90 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
1dda0 54 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  T for which this
1ddb0 20 69 73 20 61 20 73 75 62 2d 71 75 65 72 79 20   is a sub-query 
1ddc0 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 54  */.  int parentT
1ddd0 61 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ab,         /* I
1dde0 6e 64 65 78 20 69 6e 20 70 50 61 72 65 6e 74 2d  ndex in pParent-
1ddf0 3e 70 53 72 63 20 6f 66 20 74 68 69 73 20 71 75  >pSrc of this qu
1de00 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50  ery */.  int *pP
1de10 61 72 65 6e 74 41 67 67 20 20 20 20 20 20 20 20  arentAgg        
1de20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
1de30 6e 74 20 75 73 65 73 20 61 67 67 72 65 67 61 74  nt uses aggregat
1de40 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
1de50 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
1de60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1de70 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
1de80 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1de90 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
1dea0 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
1deb0 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
1dec0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
1ded0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
1dee0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
1def0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1df00 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1df20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
1df30 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
1df40 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
1df50 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
1df60 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
1df70 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
1df80 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1df90 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
1dfa0 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
1dfb0 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
1dfc0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
1dfd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dfe0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
1dff0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1e000 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
1e010 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
1e020 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
1e030 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
1e040 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
1e050 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
1e060 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
1e070 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
1e080 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
1e090 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
1e0a0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
1e0b0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
1e0c0 20 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74    int isDistinct
1e0d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
1e0e0 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
1e0f0 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
1e100 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  ent */.  int dis
1e110 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
1e120 2f 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20  /* Table to use 
1e130 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
1e140 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63   set */.  int rc
1e150 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1e160 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
1e170 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
1e180 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  nction */.  int 
1e190 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20  addrSortIndex;  
1e1a0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1e1b0 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   an OP_OpenEphem
1e1c0 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
1e1d0 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
1e1e0 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
1e1f0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
1e200 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
1e210 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
1e220 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
1e230 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1e240 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
1e250 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
1e260 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1e270 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1e280 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
1e290 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1e2a0 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  b;.  if( p==0 ||
1e2b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1e2c0 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
1e2d0 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
1e2e0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
1e2f0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1e300 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
1e310 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
1e320 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73  return 1;.  mems
1e330 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c  et(&sAggInfo, 0,
1e340 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f   sizeof(sAggInfo
1e350 29 29 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20  ));..  pOrderBy 
1e360 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
1e370 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
1e380 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
1e390 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1e3a0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 20  = 0;..    /* In 
1e3b0 74 68 65 73 65 20 63 61 73 65 73 20 74 68 65 20  these cases the 
1e3c0 44 49 53 54 49 4e 43 54 20 6f 70 65 72 61 74 6f  DISTINCT operato
1e3d0 72 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  r makes no diffe
1e3e0 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20  rence to the.   
1e3f0 20 2a 2a 20 72 65 73 75 6c 74 73 2c 20 73 6f 20   ** results, so 
1e400 72 65 6d 6f 76 65 20 69 74 20 69 66 20 69 74 20  remove it if it 
1e410 77 65 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a  were specified..
1e420 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1e430 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  t(pDest->eDest==
1e440 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44  SRT_Exists || pD
1e450 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
1e460 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20  Union || .      
1e470 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
1e480 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c  t==SRT_Except ||
1e490 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
1e4a0 52 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20  RT_Discard);.   
1e4b0 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d   p->isDistinct =
1e4c0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
1e4d0 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
1e4e0 76 65 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29  ve(pParse, p, 0)
1e4f0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
1e500 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70  ect_end;.  }.  p
1e510 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1e520 64 65 72 42 79 3b 0a 0a 0a 20 20 2f 2a 20 4d 61  derBy;...  /* Ma
1e530 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20  ke local copies 
1e540 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
1e550 73 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  s for this query
1e560 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73  ..  */.  pTabLis
1e570 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69  t = p->pSrc;.  i
1e580 73 41 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b  sAgg = p->isAgg;
1e590 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
1e5a0 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 4c  EList;.  if( pEL
1e5b0 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ist==0 ) goto se
1e5c0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20  lect_end;..  /* 
1e5d0 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65  .  ** Do not eve
1e5e0 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 67 65 6e  n attempt to gen
1e5f0 65 72 61 74 65 20 61 6e 79 20 63 6f 64 65 20 69  erate any code i
1e600 66 20 77 65 20 68 61 76 65 20 61 6c 72 65 61 64  f we have alread
1e610 79 20 73 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f  y seen.  ** erro
1e620 72 73 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  rs before this r
1e630 6f 75 74 69 6e 65 20 73 74 61 72 74 73 2e 0a 20  outine starts.. 
1e640 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
1e650 2d 3e 6e 45 72 72 3e 30 20 29 20 67 6f 74 6f 20  ->nErr>0 ) goto 
1e660 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
1e670 2a 20 4f 52 44 45 52 20 42 59 20 69 73 20 69 67  * ORDER BY is ig
1e680 6e 6f 72 65 64 20 66 6f 72 20 73 6f 6d 65 20 64  nored for some d
1e690 65 73 74 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a  estinations..  *
1e6a0 2f 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  /.  if( Ignorabl
1e6b0 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
1e6c0 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20  ){.    pOrderBy 
1e6d0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  = 0;.  }..  /* B
1e6e0 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
1e6f0 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  code..  */.  v =
1e700 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1e710 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
1e720 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
1e730 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e  t_end;..  /* Gen
1e740 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
1e750 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69  ll sub-queries i
1e760 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
1e770 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  e.  */.#if !defi
1e780 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1e790 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
1e7a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1e7b0 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d  T_VIEW).  for(i=
1e7c0 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26  0; !p->pPrior &&
1e7d0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1e7e0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
1e7f0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1e800 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
1e810 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
1e820 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
1e830 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
1e840 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63   = pItem->pSelec
1e850 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67  t;.    int isAgg
1e860 53 75 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Sub;.    char *z
1e870 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e  Name = pItem->zN
1e880 61 6d 65 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  ame;..    if( pS
1e890 75 62 3d 3d 30 20 7c 7c 20 70 49 74 65 6d 2d 3e  ub==0 || pItem->
1e8a0 69 73 50 6f 70 75 6c 61 74 65 64 20 29 20 63 6f  isPopulated ) co
1e8b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1e8c0 7a 4e 61 6d 65 21 3d 30 20 29 7b 20 20 20 2f 2a  zName!=0 ){   /*
1e8d0 20 41 6e 20 73 71 6c 20 76 69 65 77 20 2a 2f 0a   An sql view */.
1e8e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1e8f0 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
1e900 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
1e910 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
1e920 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
1e930 6f 6e 74 65 78 74 20 3d 20 7a 4e 61 6d 65 3b 0a  ontext = zName;.
1e940 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e950 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28  e3SelectResolve(
1e960 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 30 29  pParse, pSub, 0)
1e970 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1e980 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
1e990 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
1e9a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1e9b0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  {.        goto s
1e9c0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
1e9d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1e9e0 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65   Increment Parse
1e9f0 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20  .nHeight by the 
1ea00 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61  height of the la
1ea10 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e  rgest expression
1ea20 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66  .    ** tree ref
1ea30 65 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c  ered to by this,
1ea40 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65   the parent sele
1ea50 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65  ct. The child se
1ea60 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20  lect.    ** may 
1ea70 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69  contain expressi
1ea80 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d  on trees of at m
1ea90 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49  ost.    ** (SQLI
1eaa0 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
1eab0 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29  H-Parse.nHeight)
1eac0 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73   height. This is
1ead0 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f   a bit.    ** mo
1eae0 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20  re conservative 
1eaf0 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20  than necessary, 
1eb00 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20  but much easier 
1eb10 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20  than enforcing. 
1eb20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c     ** an exact l
1eb30 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  imit..    */.   
1eb40 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
1eb50 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   += sqlite3Selec
1eb60 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
1eb70 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
1eb80 20 73 65 65 20 69 66 20 74 68 65 20 73 75 62 71   see if the subq
1eb90 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f  uery can be abso
1eba0 72 62 65 64 20 69 6e 74 6f 20 74 68 65 20 70 61  rbed into the pa
1ebb0 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 73 41  rent. */.    isA
1ebc0 67 67 53 75 62 20 3d 20 70 53 75 62 2d 3e 69 73  ggSub = pSub->is
1ebd0 41 67 67 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  Agg;.    if( fla
1ebe0 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
1ebf0 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
1ec00 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20  , isAggSub) ){. 
1ec10 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75       if( isAggSu
1ec20 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  b ){.        p->
1ec30 69 73 41 67 67 20 3d 20 69 73 41 67 67 20 3d 20  isAgg = isAgg = 
1ec40 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1ec50 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c   i = -1;.    }el
1ec60 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1ec70 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
1ec80 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d  &dest, SRT_Ephem
1ec90 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Tab, pItem->iCur
1eca0 73 6f 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  sor);.      sqli
1ecb0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
1ecc0 2c 20 70 53 75 62 2c 20 26 64 65 73 74 2c 20 70  , pSub, &dest, p
1ecd0 2c 20 69 2c 20 26 69 73 41 67 67 29 3b 0a 20 20  , i, &isAgg);.  
1ece0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72    }.    if( pPar
1ecf0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1ed00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1ed10 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
1ed20 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
1ed30 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
1ed40 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
1ed50 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
1ed60 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
1ed70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
1ed80 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
1ed90 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
1eda0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
1edb0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
1edc0 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
1edd0 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66  ->pEList;.#endif
1ede0 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
1edf0 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
1ee00 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
1ee10 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
1ee20 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73  pHaving;.  isDis
1ee30 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
1ee40 74 69 6e 63 74 3b 0a 0a 23 69 66 6e 64 65 66 20  tinct;..#ifndef 
1ee50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
1ee60 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a  OUND_SELECT.  /*
1ee70 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65   If there is are
1ee80 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71   a sequence of q
1ee90 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65  ueries, do the e
1eea0 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73  arlier ones firs
1eeb0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
1eec0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
1eed0 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  f( p->pRightmost
1eee0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ==0 ){.      Sel
1eef0 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69  ect *pLoop, *pRi
1ef00 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ght = 0;.      i
1ef10 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
1ef20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a    int mxSelect;.
1ef30 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d        for(pLoop=
1ef40 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
1ef50 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63  pLoop->pPrior, c
1ef60 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  nt++){.        p
1ef70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  Loop->pRightmost
1ef80 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c   = p;.        pL
1ef90 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69  oop->pNext = pRi
1efa0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69  ght;.        pRi
1efb0 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  ght = pLoop;.   
1efc0 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c     }.      mxSel
1efd0 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  ect = db->aLimit
1efe0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
1eff0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a  MPOUND_SELECT];.
1f000 20 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65        if( mxSele
1f010 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65  ct && cnt>mxSele
1f020 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
1f030 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1f040 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
1f050 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e  terms in compoun
1f060 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20  d SELECT");.    
1f070 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1f080 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f090 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65  return multiSele
1f0a0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  ct(pParse, p, pD
1f0b0 65 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  est);.  }.#endif
1f0c0 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e  ..  /* If writin
1f0d0 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67  g to memory or g
1f0e0 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a  enerating a set.
1f0f0 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67    ** only a sing
1f100 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65  le column may be
1f110 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69   output..  */.#i
1f120 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f130 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
1f140 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
1f150 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
1f160 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70  pParse, pDest, p
1f170 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
1f180 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
1f190 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  _end;.  }.#endif
1f1a0 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62  ..  /* If possib
1f1b0 6c 65 2c 20 72 65 77 72 69 74 65 20 74 68 65 20  le, rewrite the 
1f1c0 71 75 65 72 79 20 74 6f 20 75 73 65 20 47 52 4f  query to use GRO
1f1d0 55 50 20 42 59 20 69 6e 73 74 65 61 64 20 6f 66  UP BY instead of
1f1e0 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20   DISTINCT..  ** 
1f1f0 47 52 4f 55 50 20 42 59 20 6d 61 79 20 75 73 65  GROUP BY may use
1f200 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53 54 49   an index, DISTI
1f210 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73 2e 0a  NCT never does..
1f220 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 73    */.  if( p->is
1f230 44 69 73 74 69 6e 63 74 20 26 26 20 21 70 2d 3e  Distinct && !p->
1f240 69 73 41 67 67 20 26 26 20 21 70 2d 3e 70 47 72  isAgg && !p->pGr
1f250 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 70 2d 3e  oupBy ){.    p->
1f260 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
1f270 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
1f280 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
1f290 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
1f2a0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 2d  pGroupBy;.    p-
1f2b0 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  >isDistinct = 0;
1f2c0 0a 20 20 20 20 69 73 44 69 73 74 69 6e 63 74 20  .    isDistinct 
1f2d0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
1f2e0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
1f2f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
1f300 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67  hen this sorting
1f310 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68  .  ** index migh
1f320 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75  t end up being u
1f330 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74  nused if the dat
1f340 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65  a can be .  ** e
1f350 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d  xtracted in pre-
1f360 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49  sorted order.  I
1f370 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
1f380 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  se, then the.  *
1f390 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  * OP_OpenEphemer
1f3a0 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  al instruction w
1f3b0 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74  ill be changed t
1f3c0 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63  o an OP_Noop onc
1f3d0 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65  e.  ** we figure
1f3e0 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f   out that the so
1f3f0 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e  rting index is n
1f400 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20  ot needed.  The 
1f410 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20  addrSortIndex.  
1f420 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  ** variable is u
1f430 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74  sed to facilitat
1f440 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20  e that change.. 
1f450 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
1f460 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
1f470 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
1f480 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
1f490 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
1f4a0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
1f4b0 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  );.    pOrderBy-
1f4c0 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  >iECursor = pPar
1f4d0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
1f4e0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
1f4f0 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64  2] = addrSortInd
1f500 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  ex =.      sqlit
1f510 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1f520 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1f530 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72               pOr
1f550 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
1f560 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
1f570 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  +2, 0,.         
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
1f5a0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
1f5b0 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b  NDOFF);.  }else{
1f5c0 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64  .    addrSortInd
1f5d0 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20  ex = -1;.  }..  
1f5e0 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74  /* If the output
1f5f0 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72   is destined for
1f600 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
1f610 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61  le, open that ta
1f620 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
1f630 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1f640 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20  T_EphemTab ){.  
1f650 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f660 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
1f670 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e  hemeral, pDest->
1f680 69 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e  iParm, pEList->n
1f690 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Expr);.  }..  /*
1f6a0 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72   Set the limiter
1f6b0 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20  ..  */.  iEnd = 
1f6c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1f6d0 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75  abel(v);.  compu
1f6e0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
1f6f0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64  (pParse, p, iEnd
1f700 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20  );..  /* Open a 
1f710 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
1f720 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
1f730 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
1f740 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
1f750 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
1f760 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61  *pKeyInfo;.    a
1f770 73 73 65 72 74 28 20 69 73 41 67 67 20 7c 7c 20  ssert( isAgg || 
1f780 70 47 72 6f 75 70 42 79 20 29 3b 0a 20 20 20 20  pGroupBy );.    
1f790 64 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  distinct = pPars
1f7a0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70  e->nTab++;.    p
1f7b0 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
1f7c0 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
1f7d0 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29  arse, p->pEList)
1f7e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1f7f0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
1f800 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 69 73  enEphemeral, dis
1f810 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f830 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1f840 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1f850 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c  _HANDOFF);.  }el
1f860 73 65 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74  se{.    distinct
1f870 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
1f880 20 41 67 67 72 65 67 61 74 65 20 61 6e 64 20 6e   Aggregate and n
1f890 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
1f8a0 72 69 65 73 20 61 72 65 20 68 61 6e 64 6c 65 64  ries are handled
1f8b0 20 64 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a   differently */.
1f8c0 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20    if( !isAgg && 
1f8d0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
1f8e0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
1f8f0 69 73 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65  is for non-aggre
1f900 67 61 74 65 20 71 75 65 72 69 65 73 0a 20 20 20  gate queries.   
1f910 20 2a 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   ** Begin the da
1f920 74 61 62 61 73 65 20 73 63 61 6e 0a 20 20 20 20  tabase scan.    
1f930 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  */.    pWInfo = 
1f940 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1f950 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
1f960 73 74 2c 20 70 57 68 65 72 65 2c 20 26 70 4f 72  st, pWhere, &pOr
1f970 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 69  derBy, 0);.    i
1f980 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
1f990 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1f9a0 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69  .    /* If sorti
1f9b0 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61  ng index that wa
1f9c0 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
1f9d0 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  rior OP_OpenEphe
1f9e0 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e  meral .    ** in
1f9f0 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20  struction ended 
1fa00 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65  up not being nee
1fa10 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65  ded, then change
1fa20 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
1fa30 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74  meral.    ** int
1fa40 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20  o an OP_Noop..  
1fa50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64    */.    if( add
1fa60 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26  rSortIndex>=0 &&
1fa70 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
1fa80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fa90 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
1faa0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20   addrSortIndex, 
1fab0 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64  1);.      p->add
1fac0 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d  rOpenEphm[2] = -
1fad0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
1fae0 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   Use the standar
1faf0 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20  d inner loop.   
1fb00 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21   */.    assert(!
1fb10 69 73 44 69 73 74 69 6e 63 74 29 3b 0a 20 20 20  isDistinct);.   
1fb20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
1fb30 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69  (pParse, p, pELi
1fb40 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72  st, 0, 0, pOrder
1fb50 42 79 2c 20 2d 31 2c 20 70 44 65 73 74 2c 0a 20  By, -1, pDest,. 
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb70 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
1fb80 69 6e 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  inue, pWInfo->iB
1fb90 72 65 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  reak);..    /* E
1fba0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1fbb0 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a  scan loop..    *
1fbc0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  /.    sqlite3Whe
1fbd0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
1fbe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1fbf0 68 69 73 20 69 73 20 74 68 65 20 70 72 6f 63 65  his is the proce
1fc00 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
1fc10 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
1fc20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
1fc30 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
1fc40 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
1fc50 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
1fc60 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
1fc70 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
1fc80 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1fc90 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
1fca0 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
1fcb0 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
1fcc0 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
1fcd0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
1fce0 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
1fcf0 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
1fd00 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
1fd10 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
1fd20 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
1fd30 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
1fd40 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
1fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd60 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
1fd70 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
1fd80 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
1fd90 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdb0 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
1fdc0 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
1fdd0 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
1fde0 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
1fdf0 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
1fe00 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
1fe10 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
1fe20 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
1fe30 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
1fe40 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
1fe50 64 65 72 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 20  der */...    /* 
1fe60 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
1fe70 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 61 64 64  riables hold add
1fe80 72 65 73 73 65 73 20 6f 72 20 6c 61 62 65 6c 73  resses or labels
1fe90 20 66 6f 72 20 70 61 72 74 73 20 6f 66 20 74 68   for parts of th
1fea0 65 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  e.    ** virtual
1feb0 20 6d 61 63 68 69 6e 65 20 70 72 6f 67 72 61 6d   machine program
1fec0 20 77 65 20 61 72 65 20 70 75 74 74 69 6e 67 20   we are putting 
1fed0 74 6f 67 65 74 68 65 72 20 2a 2f 0a 20 20 20 20  together */.    
1fee0 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f  int addrOutputRo
1fef0 77 3b 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  w;      /* Start
1ff00 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74   of subroutine t
1ff10 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65  hat outputs a re
1ff20 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
1ff30 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77  int regOutputRow
1ff40 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  ;       /* Retur
1ff50 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
1ff60 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75  er for output su
1ff70 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
1ff80 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74  int addrSetAbort
1ff90 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ;       /* Set t
1ffa0 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e  he abort flag an
1ffb0 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  d return */.    
1ffc0 69 6e 74 20 61 64 64 72 49 6e 69 74 69 61 6c 69  int addrInitiali
1ffd0 7a 65 4c 6f 6f 70 3b 20 2f 2a 20 53 74 61 72 74  zeLoop; /* Start
1ffe0 20 6f 66 20 63 6f 64 65 20 74 68 61 74 20 69 6e   of code that in
1fff0 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 69 6e  itializes the in
20000 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
20010 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
20020 70 3b 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f  p;      /* Top o
20030 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  f the input loop
20040 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
20050 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
20060 2f 2a 20 45 6e 64 20 6f 66 20 61 6c 6c 20 70 72  /* End of all pr
20070 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20  ocessing */.    
20080 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49  int addrSortingI
20090 64 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  dx;     /* The O
200a0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
200b0 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  for the sorting 
200c0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
200d0 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20   addrReset;     
200e0 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
200f0 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
20100 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
20110 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
20120 65 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  eset;           
20130 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
20140 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72  s register for r
20150 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20  eset subroutine 
20160 2a 2f 0a 0a 20 20 20 20 61 64 64 72 45 6e 64 20  */..    addrEnd 
20170 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
20180 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
20190 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f  /* Convert TK_CO
201a0 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20  LUMN nodes into 
201b0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e  TK_AGG_COLUMN an
201c0 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69  d make entries i
201d0 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66  n.    ** sAggInf
201e0 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47  o for all TK_AGG
201f0 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
20200 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  in expressions o
20210 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c  f the.    ** SEL
20220 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
20230 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
20240 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
20250 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
20260 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
20270 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
20280 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
20290 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d    sNC.pAggInfo =
202a0 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20   &sAggInfo;.    
202b0 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
202c0 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70  gColumn = pGroup
202d0 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e  By ? pGroupBy->n
202e0 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20  Expr+1 : 0;.    
202f0 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
20300 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
20310 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
20320 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
20330 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
20340 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
20350 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
20360 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
20370 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
20380 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
20390 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
203a0 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a  &sNC, pHaving);.
203b0 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e      }.    sAggIn
203c0 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  fo.nAccumulator 
203d0 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  = sAggInfo.nColu
203e0 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  mn;.    for(i=0;
203f0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
20400 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
20410 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
20420 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
20430 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
20440 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a  .pExpr->pList);.
20450 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
20460 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
20470 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
20480 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ;..    /* Proces
20490 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
204a0 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
204b0 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
204c0 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
204d0 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
204e0 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
204f0 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
20500 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
20510 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
20520 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
20530 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
20540 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
20550 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
20560 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
20570 20 69 6e 74 20 6a 31 3b 0a 0a 20 20 20 20 20 20   int j1;..      
20580 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73  /* Create labels
20590 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
205a0 20 6e 65 65 64 69 6e 67 0a 20 20 20 20 20 20 2a   needing.      *
205b0 2f 0a 20 20 20 20 20 20 61 64 64 72 49 6e 69 74  /.      addrInit
205c0 69 61 6c 69 7a 65 4c 6f 6f 70 20 3d 20 73 71 6c  ializeLoop = sql
205d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
205e0 6c 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  l(v);..      /* 
205f0 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52  If there is a GR
20600 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65  OUP BY clause we
20610 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f   might need a so
20620 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20  rting index to. 
20630 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e       ** implemen
20640 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20  t it.  Allocate 
20650 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64  that sorting ind
20660 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74  ex now.  If it t
20670 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a  urns out.      *
20680 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
20690 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61   need it after a
206a0 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 45 70 68 65  ll, the OpenEphe
206b0 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
206c0 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  n.      ** will 
206d0 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
206e0 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20  o a Noop.  .    
206f0 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49    */.      sAggI
20700 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d  nfo.sortingIdx =
20710 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
20720 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
20730 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
20740 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
20750 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61  roupBy);.      a
20760 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  ddrSortingIdx = 
20770 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20780 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
20790 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20 20  meral, .        
207a0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
207b0 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e  ngIdx, sAggInfo.
207c0 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20  nSortingColumn, 
207d0 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63  .          0, (c
207e0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
207f0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
20800 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e  F);..      /* In
20810 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
20820 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62  locations used b
20830 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65  y GROUP BY aggre
20840 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a  gate processing.
20850 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
20860 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  UseFlag = ++pPar
20870 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
20880 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70  iAbortFlag = ++p
20890 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
208a0 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73     iAMem = pPars
208b0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
208c0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
208d0 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
208e0 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20  pr;.      iBMem 
208f0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
20900 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
20910 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
20920 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
20930 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20940 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
20950 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 0, iAbortFlag)
20960 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
20970 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61  ent((v, "clear a
20980 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
20990 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
209a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
209b0 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67  ger, 0, iUseFlag
209c0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
209d0 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
209e0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65  te accumulator e
209f0 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73  mpty"));.      s
20a00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20a10 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
20a20 61 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f  addrInitializeLo
20a30 6f 70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  op);..      /* G
20a40 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
20a50 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
20a60 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
20a70 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
20a80 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73     ** set.  This
20a90 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73   subroutine firs
20aa0 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69  t looks at the i
20ab0 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73  UseFlag.  If iUs
20ac0 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69  eFlag.      ** i
20ad0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
20ae0 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
20af0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20  e subroutine is 
20b00 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20  a no-op.  If.   
20b10 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
20b20 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74  sing calls for t
20b30 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72  he query to abor
20b40 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  t, this subrouti
20b50 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  ne.      ** incr
20b60 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72  ements the iAbor
20b70 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63  tFlag memory loc
20b80 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74  ation before ret
20b90 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20  urning in.      
20ba0 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e  ** order to sign
20bb0 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  al the caller to
20bc0 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f   abort..      */
20bd0 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62  .      addrSetAb
20be0 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ort = sqlite3Vdb
20bf0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
20c00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
20c10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
20c20 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72  nteger, 1, iAbor
20c30 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
20c40 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
20c50 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  et abort flag"))
20c60 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75  ;.      regOutpu
20c70 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tRow = ++pParse-
20c80 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
20c90 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
20ca0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
20cb0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
20cc0 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
20cd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
20ce0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
20cf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20d00 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
20d10 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
20d20 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20  OutputRow+2);.  
20d30 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
20d40 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73  (v, "Groupby res
20d50 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e  ult generator en
20d60 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20  try point"));.  
20d70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20d80 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
20d90 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
20da0 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
20db0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
20dc0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
20dd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76  ;.      if( pHav
20de0 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
20df0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
20e00 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
20e10 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
20e20 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  +1, SQLITE_JUMPI
20e30 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
20e40 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
20e50 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
20e60 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
20e70 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , pOrderBy,.    
20e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e90 20 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73    distinct, pDes
20ea0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
20eb0 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
20ec0 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
20ed0 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73  tAbort);.      s
20ee0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
20ef0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
20f00 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
20f10 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
20f20 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
20f30 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
20f40 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
20f50 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
20f60 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
20f70 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
20f80 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
20f90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
20fa0 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65  drReset = sqlite
20fb0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
20fc0 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65  (v);.      regRe
20fd0 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
20fe0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 73 65  nMem;.      rese
20ff0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
21000 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
21010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21020 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
21030 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29  eturn, regReset)
21040 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
21050 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
21060 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
21070 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
21080 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
21090 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
210a0 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
210b0 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
210c0 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
210d0 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
210e0 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
210f0 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
21100 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
21110 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
21120 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
21130 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
21140 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
21150 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
21160 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
21170 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
21180 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70  drInitializeLoop
21190 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
211a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
211b0 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
211c0 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
211d0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
211e0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
211f0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
21200 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f 75 70   pWhere, &pGroup
21210 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  By, 0);.      if
21220 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
21230 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
21240 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42       if( pGroupB
21250 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
21260 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
21270 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
21280 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
21290 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
212a0 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
212b0 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
212c0 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
212d0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
212e0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
212f0 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
21300 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
21310 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
21320 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
21330 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 47 72    */.        pGr
21340 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
21350 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67 72 6f  pBy;.        gro
21360 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
21370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21380 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
21390 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
213a0 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
213b0 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
213c0 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
213d0 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
213e0 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
213f0 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
21400 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
21410 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
21420 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
21430 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
21440 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
21450 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
21460 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
21470 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
21480 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
21490 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
214a0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
214b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
214c0 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
214d0 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
214e0 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
214f0 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
21500 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
21510 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31  l = nGroupBy + 1
21520 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
21530 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20  roupBy+1;.      
21540 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
21550 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
21560 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
21570 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  f( sAggInfo.aCol
21580 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  [i].iSorterColum
21590 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
215a0 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
215b0 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
215c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
215d0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61   }.        regBa
215e0 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
215f0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
21600 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
21610 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
21620 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
21630 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
21640 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
21650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
21660 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
21670 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
21680 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72  gIdx,regBase+nGr
21690 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20  oupBy);.        
216a0 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a  j = nGroupBy+1;.
216b0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
216c0 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
216d0 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
216e0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
216f0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
21700 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
21710 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
21720 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
21730 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
21740 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
21750 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 23 69 66  j + regBase;.#if
21760 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
21770 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
21780 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
21790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
217a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
217b0 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a  Column(pParse, .
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
217e0 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d  Col->pTab, pCol-
217f0 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e  >iColumn, pCol->
21800 69 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a  iTable, r1, 0);.
21810 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
21820 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ..            /*
21830 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 5d   sAggInfo.aCol[]
21840 20 6f 6e 6c 79 20 63 6f 6e 74 61 69 6e 73 20 6f   only contains o
21850 6e 65 20 65 6e 74 72 79 20 70 65 72 20 63 6f 6c  ne entry per col
21860 75 6d 6e 2e 20 20 53 6f 0a 20 20 20 20 20 20 20  umn.  So.       
21870 20 20 20 20 20 2a 2a 20 54 68 65 20 72 65 66 65       ** The refe
21880 72 65 6e 63 65 20 74 6f 20 70 43 6f 6c 2d 3e 69  rence to pCol->i
21890 43 6f 6c 75 6d 6e 2c 70 43 6f 6c 2d 3e 69 54 61  Column,pCol->iTa
218a0 62 6c 65 20 6d 75 73 74 20 68 61 76 65 20 62 65  ble must have be
218b0 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  en.            *
218c0 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65  * the first refe
218d0 72 65 6e 63 65 20 74 6f 20 74 68 61 74 20 63 6f  rence to that co
218e0 6c 75 6d 6e 2e 20 20 48 65 6e 63 65 2c 20 0a 20  lumn.  Hence, . 
218f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 71             ** sq
21900 6c 69 74 65 45 78 70 72 43 6f 64 65 47 65 74 43  liteExprCodeGetC
21910 6f 6c 75 6d 6e 20 69 73 20 67 75 61 72 61 6e 74  olumn is guarant
21920 65 65 64 20 74 6f 20 70 75 74 20 74 68 65 20 72  eed to put the r
21930 65 73 75 6c 74 20 69 6e 0a 20 20 20 20 20 20 20  esult in.       
21940 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75       ** the colu
21950 6d 6e 20 72 65 71 75 65 73 74 65 64 2e 20 0a 20  mn requested. . 
21960 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
21970 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
21980 28 20 72 31 3d 3d 72 32 20 29 3b 0a 20 20 20 20  ( r1==r2 );.    
21990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
219a0 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63  }.        regRec
219b0 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
219c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
219d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
219e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
219f0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
21a00 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52  Base, nCol, regR
21a10 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
21a20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21a30 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
21a40 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
21a50 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72  ingIdx, regRecor
21a60 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
21a70 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
21a80 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
21a90 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
21aa0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
21ab0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
21ac0 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  gBase, nCol);.  
21ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
21ae0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
21af0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21b00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
21b10 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
21b20 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
21b30 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
21b40 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
21b50 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20  UP BY sort"));. 
21b60 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
21b70 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
21b80 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  1;.      }..    
21b90 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
21ba0 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
21bb0 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
21bc0 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
21bd0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
21be0 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
21bf0 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
21c00 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
21c10 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
21c20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
21c30 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
21c40 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
21c50 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
21c60 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
21c70 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
21c80 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
21c90 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
21ca0 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
21cb0 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
21cc0 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
21cd0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
21ce0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
21cf0 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
21d00 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
21d10 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
21d20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
21d30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
21d40 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41  v, OP_Column, sA
21d50 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
21d60 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  x, j, iBMem+j);.
21d70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21d80 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
21d90 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  o.directMode = 1
21da0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
21db0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
21dc0 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b  se, pGroupBy->a[
21dd0 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b  j].pExpr, iBMem+
21de0 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  j);.        }.  
21df0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
21e00 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
21e10 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d   OP_Compare, iAM
21e20 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75  em, iBMem, pGrou
21e30 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  pBy->nExpr,.    
21e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e50 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
21e60 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
21e70 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73  O);.      j1 = s
21e80 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
21e90 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
21ea0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21eb0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31  3(v, OP_Jump, j1
21ec0 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20  +1, 0, j1+1);.. 
21ed0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
21ee0 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
21ef0 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
21f00 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
21f10 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20       ** Changes 
21f20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
21f30 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
21f40 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
21f50 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
21f60 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
21f70 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
21f80 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
21f90 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
21fa0 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
21fb0 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
21fc0 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
21fd0 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
21fe0 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
21ff0 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
22000 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
22010 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
22020 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
22030 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
22040 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
22050 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
22060 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
22070 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
22080 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
22090 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
220a0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
220b0 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d  arse, iBMem, iAM
220c0 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
220d0 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
220e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
220f0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
22100 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
22110 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
22120 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
22130 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
22140 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22150 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22160 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  _IfPos, iAbortFl
22170 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  ag, addrEnd);.  
22180 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22190 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74  (v, "check abort
221a0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
221b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
221c0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
221d0 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
221e0 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
221f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65  omment((v, "rese
22200 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  t accumulator"))
22210 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
22220 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  te the aggregate
22230 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61   accumulators ba
22240 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
22250 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  nt of.      ** t
22260 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20  he current row. 
22270 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
22280 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
22290 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20  e(v, j1);.      
222a0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
222b0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
222c0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
222d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
222e0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
222f0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
22300 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
22310 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20   "indicate data 
22320 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  in accumulator")
22330 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64  );..      /* End
22340 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20   of the loop.   
22350 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
22360 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
22370 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22380 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
22390 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
223a0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
223b0 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
223c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
223d0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
223e0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
223f0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
22400 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
22410 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a 20  ortingIdx, 1);. 
22420 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
22430 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
22440 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
22450 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
22460 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
22470 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
22480 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
22490 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
224a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
224b0 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
224c0 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 0a 20  row"));.      . 
224d0 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47     } /* endif pG
224e0 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20 65 6c  roupBy */.    el
224f0 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  se {.      ExprL
22500 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30  ist *pMinMax = 0
22510 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
22520 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20   *pDel = 0;.    
22530 20 20 75 38 20 66 6c 61 67 3b 0a 0a 20 20 20 20    u8 flag;..    
22540 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
22550 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e  e query is of on
22560 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
22570 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20  ng forms:.      
22580 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 53 45  **.      **   SE
22590 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d  LECT min(x) FROM
225a0 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20   ....      **   
225b0 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
225c0 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 0a  OM ....      **.
225d0 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69        ** If it i
225e0 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20  s, then ask the 
225f0 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
22600 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f  to attempt to so
22610 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  rt results.     
22620 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65 20   ** as if there 
22630 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e  was an "ORDER ON
22640 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e   x" or "ORDER ON
22650 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e   x DESC" clause.
22660 20 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68   .      ** If wh
22670 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f  ere.c is able to
22680 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73   produce results
22690 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20   sorted in this 
226a0 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20  order, then.    
226b0 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f    ** add vdbe co
226c0 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  de to break out 
226d0 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  of the processin
226e0 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65  g loop after the
226f0 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74   .      ** first
22700 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63   iteration (sinc
22710 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  e the first iter
22720 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
22730 70 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 67  p is .      ** g
22740 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65  uaranteed to ope
22750 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20  rate on the row 
22760 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d  with the minimum
22770 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20   or maximum .   
22780 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78     ** value of x
22790 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72  , the only row r
227a0 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20  equired)..      
227b0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 20 73 70  **.      ** A sp
227c0 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20  ecial flag must 
227d0 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  be passed to sql
227e0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
227f0 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20   to slightly.   
22800 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68     ** modify beh
22810 61 76 69 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77  aviour as follow
22820 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
22830 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20    **   + If the 
22840 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45  query is a "SELE
22850 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e  CT min(x)", then
22860 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20   the loop coded 
22870 62 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  by.      **     
22880 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e  where.c should n
22890 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ot iterate over 
228a0 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20  any values with 
228b0 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20  a NULL value.   
228c0 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e     **     for x.
228d0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
228e0 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d  **   + The optim
228f0 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65  izer code in whe
22900 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20  re.c (the thing 
22910 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69  that decides whi
22920 63 68 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ch.      **     
22930 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73  index or indices
22940 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20   to use) should 
22950 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e  place a differen
22960 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20  t priority on . 
22970 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69       **     sati
22980 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45  sfying the 'ORDE
22990 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61  R BY' clause tha
229a0 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68  n it does in oth
229b0 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20  er cases..      
229c0 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20  **     Refer to 
229d0 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74  code and comment
229e0 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72  s in where.c for
229f0 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20   details..      
22a00 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 20 3d 20  */.      flag = 
22a10 6d 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72  minMaxQuery(pPar
22a20 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66  se, p);.      if
22a30 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  ( flag ){.      
22a40 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78    pDel = pMinMax
22a50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
22a60 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
22a70 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
22a80 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  >pList);.       
22a90 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20   if( pMinMax && 
22aa0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
22ab0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  d ){.          p
22ac0 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72  MinMax->a[0].sor
22ad0 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57  tOrder = flag!=W
22ae0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
22af0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e  ;.          pMin
22b00 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  Max->a[0].pExpr-
22b10 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
22b20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22b30 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   }..      /* Thi
22b40 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74  s case runs if t
22b50 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73  he aggregate has
22b60 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
22b70 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  use.  The.      
22b80 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ** processing is
22b90 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69   much simpler si
22ba0 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  nce there is onl
22bb0 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20  y a single row. 
22bc0 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75       ** of outpu
22bd0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
22be0 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
22bf0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
22c00 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 57 49  Info);.      pWI
22c10 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
22c20 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
22c30 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
22c40 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 66 6c 61 67  , &pMinMax, flag
22c50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
22c60 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
22c70 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
22c80 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
22c90 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
22ca0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
22cb0 20 20 7d 0a 20 20 20 20 20 20 75 70 64 61 74 65    }.      update
22cc0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
22cd0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
22ce0 20 20 20 20 20 20 69 66 28 20 21 70 4d 69 6e 4d        if( !pMinM
22cf0 61 78 20 26 26 20 66 6c 61 67 20 29 7b 0a 20 20  ax && flag ){.  
22d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22d10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
22d20 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69  to, 0, pWInfo->i
22d30 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
22d40 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
22d50 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c  "%s() by index",
22d60 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44  (flag==WHERE_ORD
22d70 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22  ERBY_MIN?"min":"
22d80 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20 7d  max")));.      }
22d90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68  .      sqlite3Wh
22da0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
22db0 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
22dc0 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
22dd0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
22de0 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
22df0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 61  0;.      if( pHa
22e00 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ving ){.        
22e10 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
22e20 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
22e30 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c  ng, addrEnd, SQL
22e40 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
22e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
22e60 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
22e70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
22e80 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  ist, 0, 0, 0, -1
22e90 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
22ea0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20           pDest, 
22eb0 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64  addrEnd, addrEnd
22ec0 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
22ed0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
22ee0 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d  db, pDel);.    }
22ef0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
22f00 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
22f10 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20  addrEnd);.    . 
22f20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72   } /* endif aggr
22f30 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a  egate query */..
22f40 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
22f50 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
22f60 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
22f70 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
22f80 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
22f90 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
22fa0 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
22fb0 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
22fc0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
22fd0 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
22fe0 28 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70  (pParse, p, v, p
22ff0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44  EList->nExpr, pD
23000 65 73 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  est);.  }..#ifnd
23010 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
23020 55 42 51 55 45 52 59 0a 20 20 2f 2a 20 49 66 20  UBQUERY.  /* If 
23030 74 68 69 73 20 77 61 73 20 61 20 73 75 62 71 75  this was a subqu
23040 65 72 79 2c 20 77 65 20 68 61 76 65 20 6e 6f 77  ery, we have now
23050 20 63 6f 6e 76 65 72 74 65 64 20 74 68 65 20 73   converted the s
23060 75 62 71 75 65 72 79 20 69 6e 74 6f 20 61 0a 20  ubquery into a. 
23070 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
23080 62 6c 65 2e 20 20 53 6f 20 73 65 74 20 74 68 65  ble.  So set the
23090 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2e 69 73   SrcList_item.is
230a0 50 6f 70 75 6c 61 74 65 64 20 66 6c 61 67 20 74  Populated flag t
230b0 6f 20 70 72 65 76 65 6e 74 0a 20 20 2a 2a 20 74  o prevent.  ** t
230c0 68 69 73 20 73 75 62 71 75 65 72 79 20 66 72 6f  his subquery fro
230d0 6d 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  m being evaluate
230e0 64 20 61 67 61 69 6e 20 61 6e 64 20 74 6f 20 66  d again and to f
230f0 6f 72 63 65 20 74 68 65 20 75 73 65 20 6f 66 0a  orce the use of.
23100 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61    ** the tempora
23110 72 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  ry table..  */. 
23120 20 69 66 28 20 70 50 61 72 65 6e 74 20 29 7b 0a   if( pParent ){.
23130 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
23140 65 6e 74 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e  ent->pSrc->nSrc>
23150 70 61 72 65 6e 74 54 61 62 20 29 3b 0a 20 20 20  parentTab );.   
23160 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
23170 2d 3e 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74  ->pSrc->a[parent
23180 54 61 62 5d 2e 70 53 65 6c 65 63 74 3d 3d 70 20  Tab].pSelect==p 
23190 29 3b 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  );.    pParent->
231a0 70 53 72 63 2d 3e 61 5b 70 61 72 65 6e 74 54 61  pSrc->a[parentTa
231b0 62 5d 2e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d  b].isPopulated =
231c0 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   1;.  }.#endif..
231d0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
231e0 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
231f0 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
23200 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
23210 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
23220 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20   The SELECT was 
23230 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64  successfully cod
23240 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65  ed.   Set the re
23250 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20  turn code to 0. 
23260 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
23270 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  no errors..  */.
23280 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20    rc = 0;..  /* 
23290 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
232a0 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
232b0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
232c0 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
232d0 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
232e0 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
232f0 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
23300 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65  t_end:..  /* Ide
23310 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
23320 65 73 20 69 66 20 77 65 20 77 69 6c 6c 20 62 65  es if we will be
23330 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20 61   using them in a
23340 20 63 61 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73   callback.  This
23350 0a 20 20 2a 2a 20 73 74 65 70 20 69 73 20 73 6b  .  ** step is sk
23360 69 70 70 65 64 20 69 66 20 74 68 65 20 6f 75 74  ipped if the out
23370 70 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20  put is going to 
23380 73 6f 6d 65 20 6f 74 68 65 72 20 64 65 73 74 69  some other desti
23390 6e 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  nation..  */.  i
233a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
233b0 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74   && pDest->eDest
233c0 3d 3d 53 52 54 5f 43 61 6c 6c 62 61 63 6b 20 29  ==SRT_Callback )
233d0 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f  {.    generateCo
233e0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
233f0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69  , pTabList, pELi
23400 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  st);.  }..  sqli
23410 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
23420 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20  ggInfo.aCol);.  
23430 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23440 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
23450 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
23460 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
23470 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
23480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
234a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
234b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
234c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
234d0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
234e0 20 63 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f   code is used fo
234f0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  r testing and de
23500 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54  bugging only.  T
23510 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20  he code.** that 
23520 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74  follows does not
23530 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61   appear in norma
23540 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20  l builds..**.** 
23550 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
23560 72 65 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74  re used to print
23570 20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   out the content
23580 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20   of all or part 
23590 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73  of a .** parse s
235a0 74 72 75 63 74 75 72 65 73 20 73 75 63 68 20 61  tructures such a
235b0 73 20 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72  s Select or Expr
235c0 2e 20 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74  .  Such printout
235d0 73 20 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20  s are useful.** 
235e0 66 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75  for helping to u
235f0 6e 64 65 72 73 74 61 6e 64 20 77 68 61 74 20 69  nderstand what i
23600 73 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69  s happening insi
23610 64 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  de the code gene
23620 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20  rator.** during 
23630 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  the execution of
23640 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20   complex SELECT 
23650 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
23660 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20  * These routine 
23670 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61  are not called a
23680 6e 79 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74  nywhere from wit
23690 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a  hin the normal.*
236a0 2a 20 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68  * code base.  Th
236b0 65 6e 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20  en are intended 
236c0 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  to be called fro
236d0 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64 65 62  m within the deb
236e0 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d  ugger.** or from
236f0 20 74 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e   temporary "prin
23700 74 66 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69  tf" statements i
23710 6e 73 65 72 74 65 64 20 66 6f 72 20 64 65 62 75  nserted for debu
23720 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  gging..*/.void s
23730 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
23740 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
23750 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d  p->token.z && p-
23760 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20  >token.n>0 ){.  
23770 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23780 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c 20 70 2d  intf("(%.*s", p-
23790 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b  >token.n, p->tok
237a0 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  en.z);.  }else{.
237b0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
237c0 50 72 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d  Printf("(%d", p-
237d0 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >op);.  }.  if( 
237e0 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  p->pLeft ){.    
237f0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23800 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c  tf(" ");.    sql
23810 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d  ite3PrintExpr(p-
23820 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69  >pLeft);.  }.  i
23830 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a  f( p->pRight ){.
23840 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23850 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20  Printf(" ");.   
23860 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
23870 72 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  r(p->pRight);.  
23880 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  }.  sqlite3Debug
23890 50 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76  Printf(")");.}.v
238a0 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
238b0 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73  ExprList(ExprLis
238c0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
238d0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
238e0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
238f0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
23900 50 72 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d  PrintExpr(pList-
23910 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
23920 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e    if( i<pList->n
23930 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20  Expr-1 ){.      
23940 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23950 74 66 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a  tf(", ");.    }.
23960 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
23970 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65  e3PrintSelect(Se
23980 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64  lect *p, int ind
23990 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44  ent){.  sqlite3D
239a0 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53  ebugPrintf("%*sS
239b0 45 4c 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64  ELECT(%p) ", ind
239c0 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73  ent, "", p);.  s
239d0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
239e0 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  ist(p->pEList);.
239f0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23a00 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66  intf("\n");.  if
23a10 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20  ( p->pSrc ){.   
23a20 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a   char *zPrefix;.
23a30 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a      int i;.    z
23a40 50 72 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b  Prefix = "FROM";
23a50 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23a60 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69  p->pSrc->nSrc; i
23a70 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
23a80 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
23a90 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63  pItem = &p->pSrc
23aa0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71  ->a[i];.      sq
23ab0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23ac0 28 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b  ("%*s ", indent+
23ad0 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20  6, zPrefix);.   
23ae0 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b     zPrefix = "";
23af0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
23b00 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
23b10 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
23b20 67 50 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a  gPrintf("(\n");.
23b30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
23b40 72 69 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d  rintSelect(pItem
23b50 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e  ->pSelect, inden
23b60 74 2b 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73  t+10);.        s
23b70 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23b80 66 28 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74  f("%*s)", indent
23b90 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d  +8, "");.      }
23ba0 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e  else if( pItem->
23bb0 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
23bc0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23bd0 6e 74 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d  ntf("%s", pItem-
23be0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
23bf0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
23c00 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ->pTab ){.      
23c10 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23c20 69 6e 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73  intf("(table: %s
23c30 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  )", pItem->pTab-
23c40 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
23c50 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
23c60 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
23c70 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23c80 50 72 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c  Printf(" AS %s",
23c90 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
23ca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23cb0 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  f( i<p->pSrc->nS
23cc0 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc-1 ){.        
23cd0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23ce0 74 66 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d  tf(",");.      }
23cf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
23d00 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
23d10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
23d20 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20   p->pWhere ){.  
23d30 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23d40 69 6e 74 66 28 22 25 2a 73 20 57 48 45 52 45 20  intf("%*s WHERE 
23d50 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
23d60 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
23d70 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b  Expr(p->pWhere);
23d80 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
23d90 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
23da0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f   }.  if( p->pGro
23db0 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
23dc0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23dd0 25 2a 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20  %*s GROUP BY ", 
23de0 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
23df0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
23e00 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
23e10 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  y);.    sqlite3D
23e20 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
23e30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
23e40 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71  Having ){.    sq
23e50 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23e60 28 22 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20  ("%*s HAVING ", 
23e70 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
23e80 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
23e90 72 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  r(p->pHaving);. 
23ea0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23eb0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
23ec0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
23ed0 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
23ee0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
23ef0 73 20 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e  s ORDER BY ", in
23f00 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
23f10 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
23f20 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  ist(p->pOrderBy)
23f30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
23f40 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
23f50 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20    }.}./* End of 
23f60 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65  the structure de
23f70 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64  bug printing cod
23f80 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
23f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
23fd0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
23fe0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
23ff0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
24000 45 5f 44 45 42 55 47 29 20 2a 2f 0a              E_DEBUG) */.