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

Artifact 058d5c227953755cc393ad359f35b653b9337fee:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 34 38 33  select.c,v 1.483
0200: 20 32 30 30 38 2f 31 31 2f 31 31 20 31 38 3a 32   2008/11/11 18:2
0210: 38 3a 35 39 20 64 72 68 20 45 78 70 20 24 0a 2a  8:59 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 73 65 6c  rBy;.  pNew->sel
09e0: 46 6c 61 67 73 20 3d 20 69 73 44 69 73 74 69 6e  Flags = isDistin
09f0: 63 74 20 3f 20 53 46 5f 44 69 73 74 69 6e 63 74  ct ? SF_Distinct
0a00: 20 3a 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70   : 0;.  pNew->op
0a10: 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
0a20: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  pNew->pLimit = p
0a30: 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  Limit;.  pNew->p
0a40: 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
0a50: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
0a60: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
0a70: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0a80: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
0a90: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0aa0: 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66  hm[2] = -1;.  if
0ab0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0ac0: 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72  ed ) {.    clear
0ad0: 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 29  Select(db, pNew)
0ae0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d  ;.    if( pNew!=
0af0: 26 73 74 61 6e 64 69 6e 20 29 20 73 71 6c 69 74  &standin ) sqlit
0b00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
0b10: 77 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  w);.    pNew = 0
0b20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
0b30: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
0b40: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
0b50: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0b60: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
0b70: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
0b80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
0b90: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
0ba0: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
0bb0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
0bc0: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
0bd0: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
0be0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
0bf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
0c00: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
0c10: 66 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67  fiers preceeding
0c20: 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72   the JOIN keywor
0c30: 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  d, determine the
0c40: 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e  .** type of join
0c50: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
0c60: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  eger constant th
0c70: 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61  at expresses tha
0c80: 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72  t type.** in ter
0c90: 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ms of the follow
0ca0: 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a  ing bit values:.
0cb0: 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e  **.**     JT_INN
0cc0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f  ER.**     JT_CRO
0cd0: 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54  SS.**     JT_OUT
0ce0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54  ER.**     JT_NAT
0cf0: 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c  URAL.**     JT_L
0d00: 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49  EFT.**     JT_RI
0d10: 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c  GHT.**.** A full
0d20: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74   outer join is t
0d30: 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  he combination o
0d40: 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54  f JT_LEFT and JT
0d50: 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  _RIGHT..**.** If
0d60: 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75   an illegal or u
0d70: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
0d80: 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68  type is seen, th
0d90: 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a  en still return.
0da0: 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20  ** a join type, 
0db0: 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72  but put an error
0dc0: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
0dd0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
0de0: 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65   sqlite3JoinType
0df0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0e00: 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e  Token *pA, Token
0e10: 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29   *pB, Token *pC)
0e20: 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65  {.  int jointype
0e30: 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61   = 0;.  Token *a
0e40: 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e  pAll[3];.  Token
0e50: 20 2a 70 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   *p;.  static co
0e60: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
0e70: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79   const char zKey
0e80: 77 6f 72 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20  word[8];.    u8 
0e90: 6e 43 68 61 72 3b 0a 20 20 20 20 75 38 20 63 6f  nChar;.    u8 co
0ea0: 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73  de;.  } keywords
0eb0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61  [] = {.    { "na
0ec0: 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41  tural", 7, JT_NA
0ed0: 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22  TURAL },.    { "
0ee0: 6c 65 66 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f  left",    4, JT_
0ef0: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  LEFT|JT_OUTER },
0f00: 0a 20 20 20 20 7b 20 22 72 69 67 68 74 22 2c 20  .    { "right", 
0f10: 20 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54    5, JT_RIGHT|JT
0f20: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0f30: 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54  "full",    4, JT
0f40: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a  _LEFT|JT_RIGHT|J
0f50: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0f60: 20 22 6f 75 74 65 72 22 2c 20 20 20 35 2c 20 4a   "outer",   5, J
0f70: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0f80: 20 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a   "inner",   5, J
0f90: 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b  T_INNER },.    {
0fa0: 20 22 63 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a   "cross",   5, J
0fb0: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53  T_INNER|JT_CROSS
0fc0: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
0fd0: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
0fe0: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
0ff0: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
1000: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
1010: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
1020: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
1030: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
1040: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f  for(j=0; j<sizeo
1050: 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65  f(keywords)/size
1060: 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b  of(keywords[0]);
1070: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1080: 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b   p->n==keywords[
1090: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
10a0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
10b0: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
10c0: 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >z, keywords[j].
10d0: 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d  zKeyword, p->n)=
10e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f  =0 ){.        jo
10f0: 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72  intype |= keywor
1100: 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20  ds[j].code;.    
1110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1120: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1130: 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f   j>=sizeof(keywo
1140: 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77  rds)/sizeof(keyw
1150: 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ords[0]) ){.    
1160: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54    jointype |= JT
1170: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
1180: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1190: 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74   if(.     (joint
11a0: 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c  ype & (JT_INNER|
11b0: 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f  JT_OUTER))==(JT_
11c0: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20  INNER|JT_OUTER) 
11d0: 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  ||.     (jointyp
11e0: 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30  e & JT_ERROR)!=0
11f0: 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  .  ){.    const 
1200: 63 68 61 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b  char *zSp = " ";
1210: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 21  .    assert( pB!
1220: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  =0 );.    if( pC
1230: 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a  ==0 ){ zSp++; }.
1240: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1250: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
1260: 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72  nown or unsuppor
1270: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22  ted join type: "
1280: 0a 20 20 20 20 20 20 20 22 25 54 20 25 54 25 73  .       "%T %T%s
1290: 25 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70  %T", pA, pB, zSp
12a0: 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  , pC);.    joint
12b0: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
12c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e    }else if( join
12d0: 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54 20  type & JT_RIGHT 
12e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
12f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
1300: 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64        "RIGHT and
1310: 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e   FULL OUTER JOIN
1320: 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e  s are not curren
1330: 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b  tly supported");
1340: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
1350: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20  JT_INNER;.  }.  
1360: 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b  return jointype;
1370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1380: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1390: 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c  column in a tabl
13a0: 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
13b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   the column.** i
13c0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
13d0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
13e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75  .static int colu
13f0: 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  mnIndex(Table *p
1400: 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Tab, const char 
1410: 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  *zCol){.  int i;
1420: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1430: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
1440: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1450: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
1460: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  l[i].zName, zCol
1470: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1480: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
14a0: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74 6f  he value of a to
14b0: 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27 2d  ken to a '\000'-
14c0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
14d0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
14e0: 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65 6e  d setToken(Token
14f0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1500: 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28 75  *z){.  p->z = (u
1510: 38 2a 29 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20 7a  8*)z;.  p->n = z
1520: 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30   ? strlen(z) : 0
1530: 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a  ;.  p->dyn = 0;.
1540: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1550: 20 74 6f 6b 65 6e 20 74 6f 20 74 68 65 20 64 6f   token to the do
1560: 75 62 6c 65 2d 71 75 6f 74 65 64 20 61 6e 64 20  uble-quoted and 
1570: 65 73 63 61 70 65 64 20 76 65 72 73 69 6f 6e 20  escaped version 
1580: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 70 6f  of the string po
1590: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
15a0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3b 0a 2a  . For example;.*
15b0: 2a 0a 2a 2a 20 20 20 20 7b 61 22 62 63 7d 20 20  *.**    {a"bc}  
15c0: 2d 3e 20 20 7b 22 61 22 22 62 63 22 7d 0a 2a 2f  ->  {"a""bc"}.*/
15d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
15e0: 51 75 6f 74 65 64 54 6f 6b 65 6e 28 50 61 72 73  QuotedToken(Pars
15f0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
1600: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1610: 2a 7a 29 7b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  *z){..  /* Check
1620: 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20 61   if the string a
1630: 70 70 65 61 72 73 20 74 6f 20 62 65 20 71 75 6f  ppears to be quo
1640: 74 65 64 20 75 73 69 6e 67 20 22 2e 2e 2e 22 20  ted using "..." 
1650: 6f 72 20 60 2e 2e 2e 60 0a 20 20 2a 2a 20 6f 72  or `...`.  ** or
1660: 20 5b 2e 2e 2e 5d 20 6f 72 20 27 2e 2e 2e 27 20   [...] or '...' 
1670: 6f 72 20 69 66 20 74 68 65 20 73 74 72 69 6e 67  or if the string
1680: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 22 20   contains any " 
1690: 63 68 61 72 61 63 74 65 72 73 2e 20 20 0a 20 20  characters.  .  
16a0: 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74  ** If it does, t
16b0: 68 65 6e 20 72 65 63 6f 72 64 20 61 20 76 65 72  hen record a ver
16c0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 72 69  sion of the stri
16d0: 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ng with the spec
16e0: 69 61 6c 0a 20 20 2a 2a 20 63 68 61 72 61 63 74  ial.  ** charact
16f0: 65 72 73 20 65 73 63 61 70 65 64 2e 0a 20 20 2a  ers escaped..  *
1700: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1710: 7a 32 20 3d 20 7a 3b 0a 20 20 69 66 28 20 2a 7a  z2 = z;.  if( *z
1720: 32 21 3d 27 5b 27 20 26 26 20 2a 7a 32 21 3d 27  2!='[' && *z2!='
1730: 60 27 20 26 26 20 2a 7a 32 21 3d 27 5c 27 27 20  `' && *z2!='\'' 
1740: 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  ){.    while( *z
1750: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 2a  2 ){.      if( *
1760: 7a 32 3d 3d 27 22 27 20 29 20 62 72 65 61 6b 3b  z2=='"' ) break;
1770: 0a 20 20 20 20 20 20 7a 32 2b 2b 3b 0a 20 20 20  .      z2++;.   
1780: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 2a 7a   }.  }..  if( *z
1790: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 72 69  2 ){.    /* Stri
17a0: 6e 67 20 63 6f 6e 74 61 69 6e 73 20 22 20 63 68  ng contains " ch
17b0: 61 72 61 63 74 65 72 73 20 2d 20 63 6f 70 79 20  aracters - copy 
17c0: 61 6e 64 20 71 75 6f 74 65 20 74 68 65 20 73 74  and quote the st
17d0: 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e  ring. */.    p->
17e0: 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  z = (u8 *)sqlite
17f0: 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
1800: 3e 64 62 2c 20 22 5c 22 25 77 5c 22 22 2c 20 7a  >db, "\"%w\"", z
1810: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 20  );.    if( p->z 
1820: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20  ){.      p->n = 
1830: 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70  strlen((char *)p
1840: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ->z);.      p->d
1850: 79 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  yn = 1;.    }.  
1860: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 74  }else{.    /* St
1870: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  ring contains no
1880: 20 22 20 63 68 61 72 61 63 74 65 72 73 20 2d 20   " characters - 
1890: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
18a0: 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 7a 20 3d 20  . */.    p->z = 
18b0: 28 75 38 2a 29 7a 3b 0a 20 20 20 20 70 2d 3e 6e  (u8*)z;.    p->n
18c0: 20 3d 20 28 7a 32 20 2d 20 7a 29 3b 0a 20 20 20   = (z2 - z);.   
18d0: 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 20 20 7d   p->dyn = 0;.  }
18e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
18f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e   an expression n
1900: 6f 64 65 20 66 6f 72 20 61 6e 20 69 64 65 6e 74  ode for an ident
1910: 69 66 69 65 72 20 77 69 74 68 20 74 68 65 20 6e  ifier with the n
1920: 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a  ame of zName.*/.
1930: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 43 72 65  Expr *sqlite3Cre
1940: 61 74 65 49 64 45 78 70 72 28 50 61 72 73 65 20  ateIdExpr(Parse 
1950: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1960: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54  har *zName){.  T
1970: 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65  oken dummy;.  se
1980: 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a  tToken(&dummy, z
1990: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
19a0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
19b0: 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30  rse, TK_ID, 0, 0
19c0: 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 2f 2a  , &dummy);.}../*
19d0: 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74  .** Add a term t
19e0: 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70 72  o the WHERE expr
19f0: 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70  ession in *ppExp
1a00: 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  r that requires 
1a10: 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75  the.** zCol colu
1a20: 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69  mn to be equal i
1a30: 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  n the two tables
1a40: 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62 32   pTab1 and pTab2
1a50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a60: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20   addWhereTerm(. 
1a70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1a90: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1aa0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1ab0: 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ol,        /* Na
1ac0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1ad0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c   */.  const Tabl
1ae0: 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f  e *pTab1,      /
1af0: 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f  * First table */
1b00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b10: 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20 41  Alias1,     /* A
1b20: 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74 20 74  lias for first t
1b30: 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  able.  May be NU
1b40: 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61  LL */.  const Ta
1b50: 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20  ble *pTab2,     
1b60: 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65   /* Second table
1b70: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1b80: 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20 2f   *zAlias2,     /
1b90: 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63 6f  * Alias for seco
1ba0: 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62  nd table.  May b
1bb0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
1bc0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 2c  iRightJoinTable,
1bd0: 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
1be0: 73 6f 72 20 66 6f 72 20 74 68 65 20 72 69 67 68  sor for the righ
1bf0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  t table */.  Exp
1c00: 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20  r **ppExpr,     
1c10: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
1c20: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74   equality term t
1c30: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
1c40: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74  n */.  int isOut
1c50: 65 72 4a 6f 69 6e 20 20 20 20 20 20 20 20 20 20  erJoin          
1c60: 2f 2a 20 54 72 75 65 20 69 66 20 64 65 61 6c 69  /* True if deali
1c70: 6e 67 20 77 69 74 68 20 61 6e 20 4f 55 54 45 52  ng with an OUTER
1c80: 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78   join */.){.  Ex
1c90: 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c  pr *pE1a, *pE1b,
1ca0: 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a   *pE1c;.  Expr *
1cb0: 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45  pE2a, *pE2b, *pE
1cc0: 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a  2c;.  Expr *pE;.
1cd0: 0a 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65  .  pE1a = sqlite
1ce0: 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50  3CreateIdExpr(pP
1cf0: 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70  arse, zCol);.  p
1d00: 45 32 61 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E2a = sqlite3Cre
1d10: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1d20: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a  , zCol);.  if( z
1d30: 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20  Alias1==0 ){.   
1d40: 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61 62 31   zAlias1 = pTab1
1d50: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70  ->zName;.  }.  p
1d60: 45 31 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E1b = sqlite3Cre
1d70: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1d80: 2c 20 7a 41 6c 69 61 73 31 29 3b 0a 20 20 69 66  , zAlias1);.  if
1d90: 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a  ( zAlias2==0 ){.
1da0: 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20 70 54      zAlias2 = pT
1db0: 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  ab2->zName;.  }.
1dc0: 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65 33    pE2b = sqlite3
1dd0: 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61  CreateIdExpr(pPa
1de0: 72 73 65 2c 20 7a 41 6c 69 61 73 32 29 3b 0a 20  rse, zAlias2);. 
1df0: 20 70 45 31 63 20 3d 20 73 71 6c 69 74 65 33 50   pE1c = sqlite3P
1e00: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1e10: 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61 2c  DOT, pE1b, pE1a,
1e20: 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73 71   0);.  pE2c = sq
1e30: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1e40: 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c  e, TK_DOT, pE2b,
1e50: 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20   pE2a, 0);.  pE 
1e60: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1e70: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
1e80: 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20  1c, pE2c, 0);.  
1e90: 69 66 28 20 70 45 20 26 26 20 69 73 4f 75 74 65  if( pE && isOute
1ea0: 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70  rJoin ){.    Exp
1eb0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 2c  rSetProperty(pE,
1ec0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
1ed0: 20 20 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69     pE->iRightJoi
1ee0: 6e 54 61 62 6c 65 20 3d 20 69 52 69 67 68 74 4a  nTable = iRightJ
1ef0: 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  oinTable;.  }.  
1f00: 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  *ppExpr = sqlite
1f10: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
1f20: 3e 64 62 2c 2a 70 70 45 78 70 72 2c 20 70 45 29  >db,*ppExpr, pE)
1f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1f40: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
1f50: 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74  roperty on all t
1f60: 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65  erms of the give
1f70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
1f80: 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70   And set the Exp
1f90: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
1fa0: 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20  e to iTable for 
1fb0: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
1fc0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  e.** expression.
1fd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
1fe0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1ff0: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
2000: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
2010: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
2020: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
2030: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
2040: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
2050: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
2060: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
2070: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
2080: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
2090: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
20a0: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
20b0: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
20c0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
20d0: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
20e0: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
20f0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
2100: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
2110: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
2120: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
2130: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
2140: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
2150: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
2160: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  .**.** The Expr.
2170: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2180: 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20  tells the WHERE 
2190: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
21a0: 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78  g that the.** ex
21b0: 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73  pression depends
21c0: 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74   on table iRight
21d0: 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69  JoinTable even i
21e0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20  f that table is 
21f0: 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c  not.** explicitl
2200: 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  y mentioned in t
2210: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
2220: 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  That information
2230: 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f   is needed.** fo
2240: 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  r cases like thi
2250: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
2260: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
2270: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
2280: 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d  a=t2.b AND t1.x=
2290: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72  5.**.** The wher
22a0: 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74  e clause needs t
22b0: 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  o defer the hand
22c0: 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78  ling of the t1.x
22d0: 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c  =5.** term until
22e0: 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f   after the t2 lo
22f0: 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  op of the join. 
2300: 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a   In that way, a.
2310: 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77  ** NULL t2 row w
2320: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
2330: 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35  whenever t1.x!=5
2340: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a  .  If we do not.
2350: 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  ** defer the han
2360: 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c  dling of t1.x=5,
2370: 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63   it will be proc
2380: 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  essed immediatel
2390: 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74  y.** after the t
23a0: 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20  1 loop and rows 
23b0: 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c  with t1.x!=5 wil
23c0: 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69  l never appear i
23d0: 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c  n.** the output,
23e0: 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72   which is incorr
23f0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
2400: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
2410: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61  Expr *p, int iTa
2420: 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ble){.  while( p
2430: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
2440: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
2450: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d 3e  omJoin);.    p->
2460: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2470: 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65  = iTable;.    se
2480: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
2490: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
24a0: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
24b0: 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68    } .}../*.** Th
24c0: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
24d0: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
24e0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
24f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2500: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
2510: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
2520: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
2530: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
2540: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
2550: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
2560: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
2570: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
2580: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  rms..**.** The t
2590: 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63  erms of a FROM c
25a0: 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69  lause are contai
25b0: 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63  ned in the Selec
25c0: 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65  t.pSrc structure
25d0: 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f  ..** The left mo
25e0: 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  st table is the 
25f0: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53  first entry in S
2600: 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65  elect.pSrc.  The
2610: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74   right-most.** t
2620: 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74  able is the last
2630: 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69   entry.  The joi
2640: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65  n operator is he
2650: 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ld in the entry 
2660: 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20  to.** the left. 
2670: 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f   Thus entry 0 co
2680: 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20  ntains the join 
2690: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  operator for the
26a0: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a   join between.**
26b0: 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31   entries 0 and 1
26c0: 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49  .  Any ON or USI
26d0: 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63  NG clauses assoc
26e0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a  iated with the j
26f0: 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20  oin are.** also 
2700: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
2710: 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  left entry..**.*
2720: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2730: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
2740: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
2750: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
2760: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
2770: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
2780: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2790: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
27a0: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
27b0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62        /* All tab
27c0: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
27d0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
27e0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2800: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
2810: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2820: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20  _item *pLeft;   
2830: 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20    /* Left table 
2840: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
2850: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2860: 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20  _item *pRight;  
2870: 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65    /* Right table
2880: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
2890: 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ..  pSrc = p->pS
28a0: 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70  rc;.  pLeft = &p
28b0: 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69  Src->a[0];.  pRi
28c0: 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b  ght = &pLeft[1];
28d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
28e0: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c  rc->nSrc-1; i++,
28f0: 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74   pRight++, pLeft
2900: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
2910: 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74  pLeftTab = pLeft
2920: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c  ->pTab;.    Tabl
2930: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
2940: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20  Right->pTab;.   
2950: 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20   int isOuter;.. 
2960: 20 20 20 69 66 28 20 70 4c 65 66 74 54 61 62 3d     if( pLeftTab=
2970: 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d  =0 || pRightTab=
2980: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2990: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
29a0: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
29b0: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a   JT_OUTER)!=0;..
29c0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
29d0: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
29e0: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
29f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2a00: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
2a10: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
2a20: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
2a30: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
2a40: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
2a50: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2a60: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
2a70: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
2a80: 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e  >pOn || pRight->
2a90: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2aa0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2ab0: 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54  g(pParse, "a NAT
2ac0: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
2ad0: 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
2ae0: 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53      "an ON or US
2af0: 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b  ING clause", 0);
2b00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2b10: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2b20: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66   for(j=0; j<pLef
2b30: 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  tTab->nCol; j++)
2b40: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
2b50: 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54 61 62  zName = pLeftTab
2b60: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
2b70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c  .        if( col
2b80: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
2b90: 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ab, zName)>=0 ){
2ba0: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68  .          addWh
2bb0: 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ereTerm(pParse, 
2bc0: 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c  zName, pLeftTab,
2bd0: 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20   pLeft->zAlias, 
2be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2c00: 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74  RightTab, pRight
2c10: 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20  ->zAlias,.      
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
2c40: 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68  iCursor, &p->pWh
2c50: 65 72 65 2c 20 69 73 4f 75 74 65 72 29 3b 0a 20  ere, isOuter);. 
2c60: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
2c70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2c80: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c  }..    /* Disall
2c90: 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ow both ON and U
2ca0: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20  SING clauses in 
2cb0: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20  the same join.  
2cc0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
2cd0: 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67  ght->pOn && pRig
2ce0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
2cf0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2d00: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
2d10: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
2d20: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
2d30: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
2d40: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
2d50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2d60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2d70: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
2d80: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
2d90: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2da0: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
2db0: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
2dc0: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
2dd0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2de0: 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  n ){.      if( i
2df0: 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e  sOuter ) setJoin
2e00: 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e  Expr(pRight->pOn
2e10: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
2e20: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
2e30: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
2e40: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
2e50: 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67   p->pWhere, pRig
2e60: 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20  ht->pOn);.      
2e70: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b  pRight->pOn = 0;
2e80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
2e90: 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d  reate extra term
2ea0: 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63  s on the WHERE c
2eb0: 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63  lause for each c
2ec0: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20  olumn named.    
2ed0: 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ** in the USING 
2ee0: 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65  clause.  Example
2ef0: 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62  : If the two tab
2f00: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2f10: 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61   are .    ** A a
2f20: 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49  nd B and the USI
2f30: 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20  NG clause names 
2f40: 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65  X, Y, and Z, the
2f50: 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a  n add this.    *
2f60: 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  * to the WHERE c
2f70: 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e  lause:    A.X=B.
2f80: 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e  X AND A.Y=B.Y AN
2f90: 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a  D A.Z=B.Z.    **
2fa0: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
2fb0: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d   if any column m
2fc0: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
2fd0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a  USING clause is.
2fe0: 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61      ** not conta
2ff0: 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62  ined in both tab
3000: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
3010: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3020: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
3030: 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20  ){.      IdList 
3040: 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d  *pList = pRight-
3050: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
3060: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
3070: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
3080: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
3090: 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  = pList->a[j].zN
30a0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
30b0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
30c0: 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20  ftTab, zName)<0 
30d0: 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  || columnIndex(p
30e0: 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29  RightTab, zName)
30f0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
3100: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3110: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
3120: 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d  join using colum
3130: 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a  n %s - column ".
3140: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74              "not
3150: 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68   present in both
3160: 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29   tables", zName)
3170: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
3180: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
3190: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
31a0: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61  Term(pParse, zNa
31b0: 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c  me, pLeftTab, pL
31c0: 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20  eft->zAlias, .  
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
31f0: 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c  Tab, pRight->zAl
3200: 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ias,.           
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3220: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
3230: 2c 20 26 70 2d 3e 70 57 68 65 72 65 2c 20 69 73  , &p->pWhere, is
3240: 4f 75 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Outer);.      }.
3250: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3260: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
3270: 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20  nsert code into 
3280: 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75  "v" that will pu
3290: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e  sh the record on
32a0: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
32b0: 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68  ** stack into th
32c0: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61  e sorter..*/.sta
32d0: 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74  tic void pushOnt
32e0: 6f 53 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65  oSorter(.  Parse
32f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3300: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
3310: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
3320: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
3330: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
3340: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
3350: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
3360: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
3370: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3380: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
3390: 61 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a            /* 
33a0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
33b0: 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74   data to be sort
33c0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  ed */.){.  Vdbe 
33d0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
33e0: 62 65 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20  be;.  int nExpr 
33f0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
3400: 72 3b 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  r;.  int regBase
3410: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
3420: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
3430: 45 78 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72  Expr+2);.  int r
3440: 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
3450: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
3460: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  rse);.  sqlite3E
3470: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
3480: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
3490: 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20  , regBase, 0);. 
34a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34b0: 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
34c0: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  e, pOrderBy->iEC
34d0: 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e  ursor, regBase+n
34e0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
34f0: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
3500: 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65  rse, regData, re
3510: 67 42 61 73 65 2b 6e 45 78 70 72 2b 31 2c 20 31  gBase+nExpr+1, 1
3520: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3530: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
3540: 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65  eRecord, regBase
3550: 2c 20 6e 45 78 70 72 20 2b 20 32 2c 20 72 65 67  , nExpr + 2, reg
3560: 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
3570: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3580: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4f  OP_IdxInsert, pO
3590: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
35a0: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
35b0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
35c0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
35d0: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
35e0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
35f0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
3600: 61 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20  ase, nExpr+2);. 
3610: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c   if( pSelect->iL
3620: 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  imit ){.    int 
3630: 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20  addr1, addr2;.  
3640: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20    int iLimit;.  
3650: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
3660: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
3670: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
3680: 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20  ->iOffset+1;.   
3690: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c   }else{.      iL
36a0: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
36b0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20  iLimit;.    }.  
36c0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
36d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
36e0: 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74  P_IfZero, iLimit
36f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3700: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
3710: 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d  ddImm, iLimit, -
3720: 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  1);.    addr2 = 
3730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3740: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
3750: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3760: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
3770: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3780: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
3790: 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  st, pOrderBy->iE
37a0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
37b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
37c0: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72  , OP_Delete, pOr
37d0: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29  derBy->iECursor)
37e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
37f0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
3800: 72 32 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74  r2);.    pSelect
3810: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
3820: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
3830: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
3840: 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73   the OFFSET.*/.s
3850: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f  tatic void codeO
3860: 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76  ffset(.  Vdbe *v
3870: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
3880: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
3890: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65   this VM */.  Se
38a0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
38b0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
38c0: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
38d0: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ded */.  int iCo
38e0: 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75  ntinue     /* Ju
38f0: 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
3900: 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f  the current reco
3910: 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  rd */.){.  if( p
3920: 2d 3e 69 4f 66 66 73 65 74 20 26 26 20 69 43 6f  ->iOffset && iCo
3930: 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20  ntinue!=0 ){.   
3940: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73   int addr;.    s
3950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3960: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70  (v, OP_AddImm, p
3970: 2d 3e 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a  ->iOffset, -1);.
3980: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
3990: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
39a0: 4f 50 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66  OP_IfNeg, p->iOf
39b0: 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  fset);.    sqlit
39c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
39d0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
39e0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
39f0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69  Comment((v, "ski
3a00: 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73  p OFFSET records
3a10: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
3a20: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
3a30: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
3a40: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
3a50: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
3a60: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
3a70: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
3a80: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
3a90: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
3aa0: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
3ab0: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
3ac0: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
3ad0: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
3ae0: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
3af0: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
3b00: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
3b10: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
3b20: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
3b30: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
3b40: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
3b50: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
3b60: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
3b70: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
3b80: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
3b90: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
3ba0: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
3bb0: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
3bc0: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
3bd0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
3be0: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
3bf0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
3c00: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
3c10: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
3c20: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
3c30: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
3c40: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
3c50: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
3c60: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
3c70: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
3c80: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
3c90: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
3ca0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3cb0: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
3cc0: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
3cd0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
3ce0: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
3cf0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
3d00: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
3d10: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
3d20: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
3d30: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
3d40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
3d50: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
3d60: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
3d70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3d80: 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  3(v, OP_Found, i
3d90: 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c  Tab, addrRepeat,
3da0: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
3db0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3dc0: 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c  IdxInsert, iTab,
3dd0: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52   r1);.  sqlite3R
3de0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
3df0: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
3e00: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
3e10: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68  error message wh
3e20: 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75  en a SELECT is u
3e30: 73 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62  sed within a sub
3e40: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65  expression.** (e
3e50: 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28  xample:  "a IN (
3e60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
3e70: 62 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61  ble)") but it ha
3e80: 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65  s more than 1 re
3e90: 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20  sult.** column. 
3ea0: 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61   We do this in a
3eb0: 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61   subroutine beca
3ec0: 75 73 65 20 74 68 65 20 65 72 72 6f 72 20 6f 63  use the error oc
3ed0: 63 75 72 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65  curs in multiple
3ee0: 0a 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73  .** places..*/.s
3ef0: 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46  tatic int checkF
3f00: 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
3f10: 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73  ectError(.  Pars
3f20: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3f30: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
3f40: 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  t. */.  SelectDe
3f50: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20  st *pDest,   /* 
3f60: 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53  Destination of S
3f70: 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f  ELECT results */
3f80: 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20  .  int nExpr    
3f90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3fa0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
3fb0: 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
3fc0: 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69  SELECT */.){.  i
3fd0: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
3fe0: 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e  ->eDest;.  if( n
3ff0: 45 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74  Expr>1 && (eDest
4000: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
4010: 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a  st==SRT_Set) ){.
4020: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4030: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c  Msg(pParse, "onl
4040: 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  y a single resul
4050: 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a  t allowed for ".
4060: 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54         "a SELECT
4070: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
4080: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29   an expression")
4090: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
40a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
40b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
40c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
40d0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
40e0: 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69  ode for the insi
40f0: 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  de of the inner 
4100: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c  loop.** of a SEL
4110: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72  ECT..**.** If sr
4120: 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e  cTab and nColumn
4130: 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20   are both zero, 
4140: 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20  then the pEList 
4150: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
4160: 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  re evaluated in 
4170: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
4180: 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72   data for this r
4190: 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e  ow.  If nColumn>
41a0: 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69  0.** then data i
41b0: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
41c0: 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20  cTab and pEList 
41d0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20  is used only to 
41e0: 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74  get the.** datat
41f0: 79 70 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f  ypes for each co
4200: 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lumn..*/.static 
4210: 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72  void selectInner
4220: 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Loop(.  Parse *p
4230: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4240: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
4250: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
4260: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
4270: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65     /* The comple
4280: 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  te select statem
4290: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ent being coded 
42a0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
42b0: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
42c0: 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62  List of values b
42d0: 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a  eing extracted *
42e0: 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20  /.  int srcTab, 
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4300: 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ull data from th
4310: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  is table */.  in
4320: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
4330: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4340: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
4350: 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a  e source table *
4360: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
4370: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49  rderBy,     /* I
4380: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74  f not NULL, sort
4390: 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74   results using t
43a0: 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  his key */.  int
43b0: 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20   distinct,      
43c0: 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20       /* If >=0, 
43d0: 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74  make sure result
43e0: 73 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a  s are distinct *
43f0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
4400: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48  pDest,      /* H
4410: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
4420: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
4430: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
4440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4450: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
4460: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
4470: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4490: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
44a0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
44b0: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a  nner loop */.){.
44c0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
44d0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
44e0: 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   i;.  int hasDis
44f0: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
4500: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
4510: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
4520: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
4530: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
4540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
4550: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
4560: 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20  ding result set 
4570: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
4580: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
4590: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
45a0: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
45b0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
45c0: 44 65 73 74 2d 3e 69 50 61 72 6d 3b 20 20 20 2f  Dest->iParm;   /
45d0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
45e0: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
45f0: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
4600: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
4610: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4620: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
4630: 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20   */..  if( v==0 
4640: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
4650: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
4660: 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d  .  hasDistinct =
4670: 20 64 69 73 74 69 6e 63 74 3e 3d 30 3b 0a 20 20   distinct>=0;.  
4680: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
4690: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
46a0: 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  ){.    codeOffse
46b0: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
46c0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75  e);.  }..  /* Pu
46d0: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
46e0: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
46f0: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
4700: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4710: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
4720: 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74  lse{.    nResult
4730: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
4740: 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  xpr;.  }.  if( p
4750: 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b  Dest->iMem==0 ){
4760: 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d  .    pDest->iMem
4770: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
4780: 31 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d  1;.    pDest->nM
4790: 65 6d 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  em = nResultCol;
47a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
47b0: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
47c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65  .  }else if( pDe
47d0: 73 74 2d 3e 6e 4d 65 6d 21 3d 6e 52 65 73 75 6c  st->nMem!=nResul
47e0: 74 43 6f 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  tCol ){.    /* T
47f0: 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
4800: 20 74 77 6f 20 53 45 4c 45 43 54 73 20 6f 66 20   two SELECTs of 
4810: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
4820: 54 20 68 61 76 65 20 64 69 66 66 65 72 69 6e 67  T have differing
4830: 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 20  .    ** numbers 
4840: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
4850: 73 2e 20 20 54 68 65 20 65 72 72 6f 72 20 6d 65  s.  The error me
4860: 73 73 61 67 65 20 77 69 6c 6c 20 62 65 20 67 65  ssage will be ge
4870: 6e 65 72 61 74 65 64 20 62 79 0a 20 20 20 20 2a  nerated by.    *
4880: 2a 20 61 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  * a higher-level
4890: 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20   routine. */.   
48a0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72   return;.  }.  r
48b0: 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74  egResult = pDest
48c0: 2d 3e 69 4d 65 6d 3b 0a 20 20 69 66 28 20 6e 43  ->iMem;.  if( nC
48d0: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66  olumn>0 ){.    f
48e0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
48f0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  n; i++){.      s
4900: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4910: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
4920: 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73  rcTab, i, regRes
4930: 75 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20  ult+i);.    }.  
4940: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21  }else if( eDest!
4950: 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20  =SRT_Exists ){. 
4960: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
4970: 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45  tination is an E
4980: 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65  XISTS(...) expre
4990: 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61  ssion, the actua
49a0: 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  l.    ** values 
49b0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
49c0: 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72  SELECT are not r
49d0: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
49e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
49f0: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
4a00: 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52  se, pEList, regR
4a10: 65 73 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52  esult, eDest==SR
4a20: 54 5f 4f 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20  T_Output);.  }. 
4a30: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75   nColumn = nResu
4a40: 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20  ltCol;..  /* If 
4a50: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
4a60: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
4a70: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
4a80: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
4a90: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
4aa0: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
4ab0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
4ac0: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
4ad0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
4ae0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
4af0: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
4b00: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
4b10: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
4b20: 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
4b30: 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ==nColumn );.   
4b40: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
4b50: 61 72 73 65 2c 20 64 69 73 74 69 6e 63 74 2c 20  arse, distinct, 
4b60: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75  iContinue, nColu
4b70: 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a  mn, regResult);.
4b80: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4b90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ==0 ){.      cod
4ba0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43  eOffset(v, p, iC
4bb0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
4bc0: 20 20 7d 0a 0a 20 20 69 66 28 20 63 68 65 63 6b    }..  if( check
4bd0: 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65  ForMultiColumnSe
4be0: 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
4bf0: 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d  , pDest, pEList-
4c00: 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 72  >nExpr) ){.    r
4c10: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 77  eturn;.  }..  sw
4c20: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
4c30: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
4c40: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
4c50: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
4c60: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
4c70: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
4c80: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
4c90: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
4ca0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
4cb0: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
4cc0: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
4cd0: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
4ce0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
4cf0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
4d00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4d10: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4d20: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
4d30: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  sult, nColumn, r
4d40: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
4d50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4d60: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
4d70: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  rm, r1);.      s
4d80: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4d90: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
4da0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4db0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e     }..    /* Con
4dc0: 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20  struct a record 
4dd0: 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72  from the query r
4de0: 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65  esult, but inste
4df0: 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76  ad of.    ** sav
4e00: 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c  ing that record,
4e10: 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79   use it as a key
4e20: 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65   to delete eleme
4e30: 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  nts from.    ** 
4e40: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
4e50: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
4e60: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
4e70: 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73  xcept: {.      s
4e80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4e90: 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  (v, OP_IdxDelete
4ea0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75  , iParm, regResu
4eb0: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  lt, nColumn);.  
4ec0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ed0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
4ee0: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
4ef0: 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
4f00: 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
4f10: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4f20: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
4f30: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
4f40: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
4f50: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
4f60: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
4f70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4f80: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
4f90: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
4fa0: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
4fb0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4fc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
4fd0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
4fe0: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
4ff0: 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r1);.      }else
5000: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32  {.        int r2
5010: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5020: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5040: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
5050: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
5060: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
5070: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5080: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
5090: 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
50a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
50b0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
50c0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
50d0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
50e0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
50f0: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
5100: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5110: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5120: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
5130: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
5140: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5150: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
5160: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
5170: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
5180: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
5190: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
51a0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
51b0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
51c0: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
51d0: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
51e0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
51f0: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
5200: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
5210: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
5220: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
5230: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
5240: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
5250: 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20    p->affinity = 
5260: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
5270: 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61  finity(pEList->a
5280: 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74  [0].pExpr, pDest
5290: 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20  ->affinity);.   
52a0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
52b0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
52c0: 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f   first glance yo
52d0: 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65  u would think we
52e0: 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20   could optimize 
52f0: 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  out the.        
5300: 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74  ** ORDER BY in t
5310: 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74  his case since t
5320: 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72  he order of entr
5330: 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20  ies in the set. 
5340: 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e         ** does n
5350: 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20  ot matter.  But 
5360: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61  there might be a
5370: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69   LIMIT clause, i
5380: 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
5390: 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65  ** case the orde
53a0: 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f  r does matter */
53b0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
53c0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
53d0: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67  pOrderBy, p, reg
53e0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
53f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
5400: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
5410: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5420: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5430: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
5440: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
5450: 67 52 65 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20  gResult, 1, r1, 
5460: 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29  &p->affinity, 1)
5470: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5480: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
5490: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
54a0: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a   regResult, 1);.
54b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
54c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
54d0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
54e0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
54f0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5500: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5510: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5520: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5530: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
5540: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
5550: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
5560: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
5570: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
5580: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
5590: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
55a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
55b0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
55c0: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
55d0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
55e0: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
55f0: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
5600: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5610: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
5620: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
5630: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
5640: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
5650: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
5660: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
5670: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
5680: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
5690: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
56a0: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
56b0: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
56c0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
56d0: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
56e0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
56f0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
5700: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
5710: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
5720: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
5730: 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  p, regResult);. 
5740: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5750: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
5760: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
5770: 72 65 67 52 65 73 75 6c 74 2c 20 69 50 61 72 6d  regResult, iParm
5780: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  , 1);.        /*
5790: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
57a0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
57b0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
57c0: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
57d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
57e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
57f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5800: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
5810: 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61  /* Send the data
5820: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
5830: 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20   function or to 
5840: 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49  a subroutine.  I
5850: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73  n the.    ** cas
5860: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
5870: 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  e, the subroutin
5880: 65 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70  e itself is resp
5890: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20  onsible for.    
58a0: 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64  ** popping the d
58b0: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ata from the sta
58c0: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ck..    */.    c
58d0: 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
58e0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
58f0: 4f 75 74 70 75 74 3a 20 7b 0a 20 20 20 20 20 20  Output: {.      
5900: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
5910: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
5920: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5930: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
5940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5950: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
5960: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
5970: 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b  t, nColumn, r1);
5980: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
5990: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
59a0: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29  pOrderBy, p, r1)
59b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
59c0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
59d0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
59e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
59f0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
5a00: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
5a10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
5a20: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
5a30: 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  t->iParm);.     
5a40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5a50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5a60: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
5a70: 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  w, regResult, nC
5a80: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
5a90: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
5aa0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
5ab0: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
5ac0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
5ad0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5ae0: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  .    }..#if !def
5af0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5b00: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a  _TRIGGER).    /*
5b10: 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73   Discard the res
5b20: 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75  ults.  This is u
5b30: 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73  sed for SELECT s
5b40: 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65  tatements inside
5b50: 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79  .    ** the body
5b60: 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20   of a TRIGGER.  
5b70: 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73  The purpose of s
5b80: 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74  uch selects is t
5b90: 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73  o call.    ** us
5ba0: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
5bb0: 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73  ions that have s
5bc0: 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65  ide effects.  We
5bd0: 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20   do not care.   
5be0: 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63   ** about the ac
5bf0: 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20  tual results of 
5c00: 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20  the select..    
5c10: 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
5c20: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5c30: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
5c40: 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rd );.      brea
5c50: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
5c60: 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
5c70: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
5c80: 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d   loop if the LIM
5c90: 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20  IT is reached.. 
5ca0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   */.  if( p->iLi
5cb0: 6d 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  mit ){.    asser
5cc0: 74 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t( pOrderBy==0 )
5cd0: 3b 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  ;  /* If there i
5ce0: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  s an ORDER BY, t
5cf0: 68 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20  he call to.     
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d10: 20 20 20 20 20 20 20 2a 2a 20 70 75 73 68 4f 6e         ** pushOn
5d20: 74 6f 53 6f 72 74 65 72 28 29 20 77 6f 75 6c 64  toSorter() would
5d30: 20 68 61 76 65 20 63 6c 65 61 72 65 64 20 70 2d   have cleared p-
5d40: 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 73  >iLimit */.    s
5d50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5d60: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70  (v, OP_AddImm, p
5d70: 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20  ->iLimit, -1);. 
5d80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5d90: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp2(v, OP_IfZer
5da0: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
5db0: 72 65 61 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  reak);.  }.}../*
5dc0: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
5dd0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65  ression list, ge
5de0: 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  nerate a KeyInfo
5df0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
5e00: 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63  records.** the c
5e10: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
5e20: 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65  e for each expre
5e30: 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78  ssion in that ex
5e40: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
5e50: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72  *.** If the Expr
5e60: 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52  List is an ORDER
5e70: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
5e80: 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20  clause then the 
5e90: 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79  resulting.** Key
5ea0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
5eb0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
5ec0: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
5ed0: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
5ee0: 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74  o.** implement t
5ef0: 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20  hat clause.  If 
5f00: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
5f10: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
5f20: 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68  f a SELECT.** th
5f30: 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  en the KeyInfo s
5f40: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
5f50: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
5f60: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
5f70: 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69  al.** index to i
5f80: 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49  mplement a DISTI
5f90: 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20  NCT test..**.** 
5fa0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
5fb0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
5fc0: 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72  ure is obtain fr
5fd0: 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20  om malloc.  The 
5fe0: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
5ff0: 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
6000: 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68  le for seeing th
6010: 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
6020: 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
6030: 2a 2a 20 66 72 65 65 64 2e 20 20 41 64 64 20 74  ** freed.  Add t
6040: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
6050: 74 75 72 65 20 74 6f 20 74 68 65 20 50 34 20 66  ture to the P4 f
6060: 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64  ield of an opcod
6070: 65 20 75 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45  e using.** P4_KE
6080: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73  YINFO_HANDOFF is
6090: 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f   the usual way o
60a0: 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74  f dealing with t
60b0: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  his..*/.static K
60c0: 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46  eyInfo *keyInfoF
60d0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73  romExprList(Pars
60e0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
60f0: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73  ist *pList){.  s
6100: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
6110: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
6120: 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Expr;.  KeyInfo 
6130: 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  *pInfo;.  struct
6140: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
6150: 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
6160: 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  .  nExpr = pList
6170: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f  ->nExpr;.  pInfo
6180: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6190: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
61a0: 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70  f(*pInfo) + nExp
61b0: 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  r*(sizeof(CollSe
61c0: 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20  q*)+1) );.  if( 
61d0: 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e  pInfo ){.    pIn
61e0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  fo->aSortOrder =
61f0: 20 28 75 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43   (u8*)&pInfo->aC
6200: 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20  oll[nExpr];.    
6210: 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20  pInfo->nField = 
6220: 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f  nExpr;.    pInfo
6230: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
6240: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
6250: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
6260: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
6270: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  m++){.      Coll
6280: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
6290: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
62a0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
62b0: 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
62c0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  r);.      if( !p
62d0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
62e0: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
62f0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
6300: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
6310: 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[i] = pColl;.  
6320: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
6330: 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d  Order[i] = pItem
6340: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
6350: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6360: 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pInfo;.}.../*.**
6370: 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   If the inner lo
6380: 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  op was generated
6390: 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c   using a non-nul
63a0: 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d  l pOrderBy argum
63b0: 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ent,.** then the
63c0: 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c   results were pl
63d0: 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72  aced in a sorter
63e0: 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f  .  After the loo
63f0: 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a  p is terminated.
6400: 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75  ** we need to ru
6410: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64  n the sorter and
6420: 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75   output the resu
6430: 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  lts.  The follow
6440: 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  ing.** routine g
6450: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
6460: 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74  e needed to do t
6470: 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  hat..*/.static v
6480: 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74  oid generateSort
6490: 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  Tail(.  Parse *p
64a0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
64b0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
64c0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
64d0: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
64e0: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
64f0: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
6500: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
6510: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44  ode into this VD
6520: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  BE */.  int nCol
6530: 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d  umn,      /* Num
6540: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f  ber of columns o
6550: 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  f data */.  Sele
6560: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a  ctDest *pDest /*
6570: 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65   Write the sorte
6580: 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  d results here *
6590: 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 72 6b 20 3d  /.){.  int brk =
65a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
65b0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20  Label(v);.  int 
65c0: 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  cont = sqlite3Vd
65d0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
65e0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e    int addr;.  in
65f0: 74 20 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73  t iTab;.  int ps
6600: 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45  eudoTab = 0;.  E
6610: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
6620: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
6630: 0a 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  ..  int eDest = 
6640: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
6650: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73  int iParm = pDes
6660: 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74  t->iParm;..  int
6670: 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72   regRow;.  int r
6680: 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62  egRowid;..  iTab
6690: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43   = pOrderBy->iEC
66a0: 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65  ursor;.  if( eDe
66b0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
66c0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
66d0: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73  outine ){.    ps
66e0: 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65  eudoTab = pParse
66f0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71  ->nTab++;.    sq
6700: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6710: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
6720: 6d 6e 73 2c 20 30 2c 20 6e 43 6f 6c 75 6d 6e 29  mns, 0, nColumn)
6730: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6740: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
6750: 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f  enPseudo, pseudo
6760: 54 61 62 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f  Tab, eDest==SRT_
6770: 4f 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 61  Output);.  }.  a
6780: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
6790: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
67a0: 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 62 72  P_Sort, iTab, br
67b0: 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74  k);.  codeOffset
67c0: 28 76 2c 20 70 2c 20 63 6f 6e 74 29 3b 0a 20 20  (v, p, cont);.  
67d0: 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  regRow = sqlite3
67e0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
67f0: 65 29 3b 0a 20 20 72 65 67 52 6f 77 69 64 20 3d  e);.  regRowid =
6800: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6810: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
6820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6830: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
6840: 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ab, pOrderBy->nE
6850: 78 70 72 20 2b 20 31 2c 20 72 65 67 52 6f 77 29  xpr + 1, regRow)
6860: 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ;.  switch( eDes
6870: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
6880: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
6890: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
68a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
68b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
68c0: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
68d0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
68e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
68f0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
6900: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c  , iParm, regRow,
6910: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
6920: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6930: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
6940: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62  APPEND);.      b
6950: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
6960: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6970: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
6980: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
6990: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
69a0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
69b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
69c0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
69d0: 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65  d, regRow, 1, re
69e0: 67 52 6f 77 69 64 2c 20 26 70 2d 3e 61 66 66 69  gRowid, &p->affi
69f0: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
6a00: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
6a10: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
6a20: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31  Parse, regRow, 1
6a30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6a40: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6a50: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
6a60: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
6a70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6a80: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
6a90: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
6aa0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
6ab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
6ac0: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
6ad0: 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d  e, regRow, iParm
6ae0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
6af0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
6b00: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
6b10: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
6b20: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
6b30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
6b40: 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a  case SRT_Output:
6b50: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
6b60: 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20  routine: {.     
6b70: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71   int i;.      sq
6b80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6b90: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
6ba0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
6bb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6bc0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
6bd0: 74 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 72 65  t, pseudoTab, re
6be0: 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b  gRow, regRowid);
6bf0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
6c00: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
6c10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6c20: 20 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e   regRow!=pDest->
6c30: 69 4d 65 6d 2b 69 20 29 3b 0a 20 20 20 20 20 20  iMem+i );.      
6c40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6c50: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
6c60: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20  , pseudoTab, i, 
6c70: 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a  pDest->iMem+i);.
6c80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6c90: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
6ca0: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  put ){.        s
6cb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6cc0: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
6cd0: 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e  , pDest->iMem, n
6ce0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
6cf0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
6d00: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
6d10: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69  pParse, pDest->i
6d20: 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Mem, nColumn);. 
6d30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6d40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6d50: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
6d60: 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29  d, pDest->iParm)
6d70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6d80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6d90: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6da0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
6db0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
6dc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
6dd0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
6de0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
6df0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
6e00: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
6e10: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20  e, regRowid);.. 
6e20: 20 2f 2a 20 4c 49 4d 49 54 20 68 61 73 20 62 65   /* LIMIT has be
6e30: 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  en implemented b
6e40: 79 20 74 68 65 20 70 75 73 68 4f 6e 74 6f 53 6f  y the pushOntoSo
6e50: 72 74 65 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a  rter() routine..
6e60: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
6e70: 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 0a  ->iLimit==0 );..
6e80: 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20    /* The bottom 
6e90: 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f  of the loop.  */
6ea0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
6eb0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f  solveLabel(v, co
6ec0: 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  nt);.  sqlite3Vd
6ed0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
6ee0: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
6ef0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
6f00: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 62  esolveLabel(v, b
6f10: 72 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74  rk);.  if( eDest
6f20: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
6f30: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6f40: 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tine ){.    sqli
6f50: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6f60: 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64   OP_Close, pseud
6f70: 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d  oTab, 0);.  }..}
6f80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
6f90: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
6fa0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
6fb0: 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e  the 'declaration
6fc0: 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a   type' of the.**
6fd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
6fe0: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  r. The string ma
6ff0: 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  y be treated as 
7000: 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61  static by the ca
7010: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ller..**.** The 
7020: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
7030: 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61   is the exact da
7040: 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f  tatype definitio
7050: 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  n extracted from
7060: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
7070: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
7080: 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65  atement if the e
7090: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
70a0: 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65  olumn. The.** de
70b0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
70c0: 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64  or a ROWID field
70d0: 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61   is INTEGER. Exa
70e0: 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70  ctly when an exp
70f0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  ression.** is co
7100: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
7110: 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78  n can be complex
7120: 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65   in the presence
7130: 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20   of subqueries. 
7140: 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65  The.** result-se
7150: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  t expression in 
7160: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
7170: 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74  wing SELECT stat
7180: 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f  ements is .** co
7190: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
71a0: 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  n by this functi
71b0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  on..**.**   SELE
71c0: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
71d0: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
71e0: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
71f0: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
7200: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
7210: 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  tbl);.**   SELEC
7220: 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45  T abc FROM (SELE
7230: 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52  CT col AS abc FR
7240: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20  OM tbl);.** .** 
7250: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
7260: 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70  type for any exp
7270: 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68  ression other th
7280: 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e  an a column is N
7290: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ULL..*/.static c
72a0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
72b0: 6e 54 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e  nType(.  NameCon
72c0: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78  text *pNC, .  Ex
72d0: 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e  pr *pExpr,.  con
72e0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
72f0: 69 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  inDb,.  const ch
7300: 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62  ar **pzOriginTab
7310: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7320: 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a  *pzOriginCol.){.
7330: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
7340: 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ype = 0;.  char 
7350: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62  const *zOriginDb
7360: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
7370: 73 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d  st *zOriginTab =
7380: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
7390: 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30   *zOriginCol = 0
73a0: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28  ;.  int j;.  if(
73b0: 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43   pExpr==0 || pNC
73c0: 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ->pSrcList==0 ) 
73d0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69  return 0;..  swi
73e0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
73f0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
7400: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
7410: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
7420: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
7430: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
7440: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
7450: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
7460: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
7470: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
7480: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
7490: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
74a0: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
74b0: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
74c0: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
74d0: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
74e0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
74f0: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
7500: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
7510: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
7520: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
7530: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
7540: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
7550: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
7560: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
7570: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
7580: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
7590: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
75a0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
75b0: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
75c0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20       while( pNC 
75d0: 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
75e0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61      SrcList *pTa
75f0: 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  bList = pNC->pSr
7600: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  cList;.        f
7610: 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73  or(j=0;j<pTabLis
7620: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
7630: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
7640: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
7650: 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69  ;j++);.        i
7660: 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  f( j<pTabList->n
7670: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
7680: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
7690: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
76a0: 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62         pS = pTab
76b0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65  List->a[j].pSele
76c0: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ct;.        }els
76d0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  e{.          pNC
76e0: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
76f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7700: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
7710: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
7720: 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20 20 20 20  * FIX ME:.      
7730: 20 20 2a 2a 20 54 68 69 73 20 63 61 6e 20 6f 63    ** This can oc
7740: 63 75 72 73 20 69 66 20 79 6f 75 20 68 61 76 65  curs if you have
7750: 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20   something like 
7760: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 3b 22 20  "SELECT new.x;" 
7770: 69 6e 73 69 64 65 0a 20 20 20 20 20 20 20 20 2a  inside.        *
7780: 2a 20 61 20 74 72 69 67 67 65 72 2e 20 20 49 6e  * a trigger.  In
7790: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
77a0: 20 79 6f 75 20 72 65 66 65 72 65 6e 63 65 20 74   you reference t
77b0: 68 65 20 73 70 65 63 69 61 6c 20 22 6e 65 77 22  he special "new"
77c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
77d0: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
77e0: 73 65 74 20 6f 66 20 61 20 73 65 6c 65 63 74 2e  set of a select.
77f0: 20 20 57 65 20 64 6f 20 6e 6f 74 20 68 61 76 65    We do not have
7800: 20 61 20 67 6f 6f 64 20 77 61 79 0a 20 20 20 20   a good way.    
7810: 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20 74      ** to find t
7820: 68 65 20 61 63 74 75 61 6c 20 74 61 62 6c 65 20  he actual table 
7830: 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c 20 69 74  type, so call it
7840: 20 22 54 45 58 54 22 2e 20 20 54 68 69 73 20 69   "TEXT".  This i
7850: 73 20 72 65 61 6c 6c 79 0a 20 20 20 20 20 20 20  s really.       
7860: 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 66   ** something of
7870: 20 61 20 62 75 67 2c 20 62 75 74 20 49 20 64 6f   a bug, but I do
7880: 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f   not know how to
7890: 20 66 69 78 20 69 74 2e 0a 20 20 20 20 20 20 20   fix it..       
78a0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
78b0: 68 69 73 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f  his code does no
78c0: 74 20 70 72 6f 64 75 63 65 20 74 68 65 20 63 6f  t produce the co
78d0: 72 72 65 63 74 20 61 6e 73 77 65 72 20 2d 20 69  rrect answer - i
78e0: 74 20 6a 75 73 74 20 70 72 65 76 65 6e 74 73 0a  t just prevents.
78f0: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73 65 67          ** a seg
7900: 66 61 75 6c 74 2e 20 20 53 65 65 20 74 69 63 6b  fault.  See tick
7910: 65 74 20 23 31 32 32 39 2e 0a 20 20 20 20 20 20  et #1229..      
7920: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 54 79    */.        zTy
7930: 70 65 20 3d 20 22 54 45 58 54 22 3b 0a 20 20 20  pe = "TEXT";.   
7940: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7950: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
7960: 74 28 20 70 54 61 62 20 29 3b 0a 20 20 20 20 20  t( pTab );.     
7970: 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20   if( pS ){.     
7980: 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65     /* The "table
7990: 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  " is actually a 
79a0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20  sub-select or a 
79b0: 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d  view in the FROM
79c0: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
79d0: 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ** of the SELECT
79e0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75   statement. Retu
79f0: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
7a00: 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67  on type and orig
7a10: 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  in.        ** da
7a20: 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ta for the resul
7a30: 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  t-set column of 
7a40: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a  the sub-select..
7a50: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
7a60: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26     if( iCol>=0 &
7a70: 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73  & iCol<pS->pELis
7a80: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
7a90: 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c        /* If iCol
7aa0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
7ab0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ro, then the exp
7ac0: 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73  ression requests
7ad0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
7ae0: 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73  * rowid of the s
7af0: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65  ub-select or vie
7b00: 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69  w. This expressi
7b10: 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65  on is legal (see
7b20: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
7b30: 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32  est case misc2.2
7b40: 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20  .2) - it always 
7b50: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
7b60: 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  L..          */.
7b70: 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f            NameCo
7b80: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
7b90: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
7ba0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  S->pEList->a[iCo
7bb0: 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  l].pExpr;.      
7bc0: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
7bd0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
7be0: 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74         sNC.pNext
7bf0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7c00: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
7c10: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
7c20: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
7c30: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
7c40: 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72  &zOriginDb, &zOr
7c50: 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69  iginTab, &zOrigi
7c60: 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20  nCol); .        
7c70: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
7c80: 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ( pTab->pSchema 
7c90: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
7ca0: 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  real table */.  
7cb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
7cc0: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  S );.        if(
7cd0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
7ce0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
7cf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
7d00: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
7d10: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
7d20: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
7d30: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
7d40: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
7d50: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
7d60: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f         zOriginCo
7d70: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
7d80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7d90: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
7da0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
7db0: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
7dc0: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54 61  zOriginCol = pTa
7dd0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
7de0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ame;.        }. 
7df0: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 54 61         zOriginTa
7e00: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
7e10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43  .        if( pNC
7e20: 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20  ->pParse ){.    
7e30: 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
7e40: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
7e50: 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65  ndex(pNC->pParse
7e60: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
7e70: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
7e80: 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e 43 2d  zOriginDb = pNC-
7e90: 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62  >pParse->db->aDb
7ea0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
7eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7ec0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7ed0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
7ee0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
7ef0: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
7f00: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
7f10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
7f20: 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65  a sub-select. Re
7f30: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
7f40: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20  tion type and.  
7f50: 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e      ** origin in
7f60: 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c  fo for the singl
7f70: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
7f80: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
7f90: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a  e SELECT.      *
7fa0: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  * statement..   
7fb0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65     */.      Name
7fc0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
7fd0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
7fe0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a  pExpr->pSelect;.
7ff0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
8000: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  pS->pEList->a[0]
8010: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 4e  .pExpr;.      sN
8020: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
8030: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43  >pSrc;.      sNC
8040: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
8050: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
8060: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
8070: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
8080: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
8090: 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72  &zOriginDb, &zOr
80a0: 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69  iginTab, &zOrigi
80b0: 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72  nCol); .      br
80c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
80d0: 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70  f.  }.  .  if( p
80e0: 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a 20 20 20  zOriginDb ){.   
80f0: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 69   assert( pzOrigi
8100: 6e 54 61 62 20 26 26 20 70 7a 4f 72 69 67 69 6e  nTab && pzOrigin
8110: 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72  Col );.    *pzOr
8120: 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e  iginDb = zOrigin
8130: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69  Db;.    *pzOrigi
8140: 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61  nTab = zOriginTa
8150: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e  b;.    *pzOrigin
8160: 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c  Col = zOriginCol
8170: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
8180: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Type;.}../*.** G
8190: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
81a0: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
81b0: 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61  VDBE the declara
81c0: 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f  tion types of co
81d0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
81e0: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
81f0: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
8200: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a  ateColumnTypes(.
8210: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8220: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
8230: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
8240: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
8250: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
8260: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
8270: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
8280: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
8290: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
82a0: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  et */.){.#ifndef
82b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
82c0: 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20  LTYPE.  Vdbe *v 
82d0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
82e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
82f0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
8300: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
8310: 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50  abList;.  sNC.pP
8320: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
8330: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
8340: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
8350: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
8360: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
8370: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
8380: 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66  r *zType;.#ifdef
8390: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
83a0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
83b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
83c0: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
83d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
83e0: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
83f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
8400: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70  ol = 0;.    zTyp
8410: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
8420: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
8430: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
8440: 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a  rigCol);..    /*
8450: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
8460: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
8470: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
8480: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
8490: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
84a0: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
84b0: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
84c0: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
84d0: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
84e0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
84f0: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
8500: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8510: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8520: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
8530: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49  E, zOrigDb, SQLI
8540: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
8550: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8560: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8570: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
8580: 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54  rigTab, SQLITE_T
8590: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
85a0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
85b0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
85c0: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
85d0: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
85e0: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
85f0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
8600: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
8610: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
8620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8630: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8640: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
8650: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
8660: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
8670: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8680: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 20 2a 2f  OMIT_DECLTYPE */
8690: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
86a0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
86b0: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
86c0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
86d0: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
86e0: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73  esult set.  This
86f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
8700: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
8710: 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76  the.** azCol[] v
8720: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  alues in the cal
8730: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
8740: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
8750: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
8760: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8770: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
8780: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
8790: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
87a0: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
87b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
87c0: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
87d0: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
87e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
87f0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
8800: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
8810: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
8820: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
8830: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
8840: 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d  lNames, shortNam
8850: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
8860: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
8870: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
8880: 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69   an EXPLAIN, ski
8890: 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20  p this step */. 
88a0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
88b0: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  lain ){.    retu
88c0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
88d0: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
88e0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
88f0: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76  colNamesSet || v
8900: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
8910: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
8920: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  ;.  pParse->colN
8930: 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66  amesSet = 1;.  f
8940: 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ullNames = (db->
8950: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
8960: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
8970: 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20  .  shortNames = 
8980: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
8990: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
89a0: 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  s)!=0;.  sqlite3
89b0: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
89c0: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
89d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
89e0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
89f0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
8a00: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
8a10: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
8a20: 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74   if( p==0 ) cont
8a30: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45  inue;.    if( pE
8a40: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8a50: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
8a60: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
8a70: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
8a80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8a90: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8aa0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
8ab0: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
8ac0: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
8ad0: 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( (p->op==TK_C
8ae0: 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  OLUMN || p->op==
8af0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26  TK_AGG_COLUMN) &
8b00: 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20  & pTabList ){.  
8b10: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
8b20: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
8b30: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  l;.      int iCo
8b40: 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  l = p->iColumn;.
8b50: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
8b60: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
8b70: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
8b80: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54  ].iCursor!=p->iT
8b90: 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  able; j++){}.   
8ba0: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61     assert( j<pTa
8bb0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
8bc0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
8bd0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
8be0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
8bf0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
8c00: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
8c10: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
8c20: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
8c30: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
8c40: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
8c50: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
8c60: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
8c70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8c80: 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
8c90: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
8ca0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8cb0: 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20  if( !shortNames 
8cc0: 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  && !fullNames ){
8cd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8ce0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
8cf0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
8d00: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
8d10: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
8d20: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73  (db, (char*)p->s
8d30: 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e  pan.z, p->span.n
8d40: 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  ), SQLITE_DYNAMI
8d50: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  C);.      }else 
8d60: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c  if( fullNames ||
8d70: 20 28 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26   (!shortNames &&
8d80: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
8d90: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  1) ){.        ch
8da0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
8db0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
8dc0: 62 3b 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61  b;. .        zTa
8dd0: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
8de0: 6a 5d 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  j].zAlias;.     
8df0: 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73     if( fullNames
8e00: 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54   || zTab==0 ) zT
8e10: 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ab = pTab->zName
8e20: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
8e30: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
8e40: 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54  (db, "%s.%s", zT
8e50: 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  ab, zCol);.     
8e60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8e70: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8e80: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
8e90: 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d  me, SQLITE_DYNAM
8ea0: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
8eb0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8ec0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8ed0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8ee0: 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45  ME, zCol, SQLITE
8ef0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
8f00: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
8f10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8f20: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8f30: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8f40: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8f50: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
8f60: 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a  (char*)p->span.z
8f70: 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 2c 20 53 51  , p->span.n), SQ
8f80: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
8f90: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
8fa0: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
8fb0: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
8fc0: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69 66   pEList);.}..#if
8fd0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8fe0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
8ff0: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74  ./*.** Name of t
9000: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
9010: 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72  erator, used for
9020: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e   error messages.
9030: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
9040: 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e   char *selectOpN
9050: 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63  ame(int id){.  c
9060: 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68  har *z;.  switch
9070: 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65  ( id ){.    case
9080: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a   TK_ALL:       z
9090: 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20   = "UNION ALL"; 
90a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
90b0: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
90c0: 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b  z = "INTERSECT";
90d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
90e0: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20  se TK_EXCEPT:   
90f0: 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20   z = "EXCEPT";  
9100: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
9110: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
9120: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20    z = "UNION";  
9130: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
9140: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65    return z;.}.#e
9150: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9160: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
9170: 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  ECT */../*.** Gi
9180: 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65 73 73  ven a an express
9190: 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20  ion list (which 
91a0: 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69  is really the li
91b0: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
91c0: 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74  s.** that form t
91d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
91e0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
91f0: 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70  ent) compute app
9200: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75  ropriate.** colu
9210: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74  mn names for a t
9220: 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20  able that would 
9230: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
9240: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
9250: 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  All column names
9260: 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e   will be unique.
9270: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
9280: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65  column names are
9290: 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75   computed.  Colu
92a0: 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e  mn.zType, Column
92b0: 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f  .zColl,.** and o
92c0: 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43  ther fields of C
92d0: 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64  olumn are zeroed
92e0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
92f0: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
9300: 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ess.  If a memor
9310: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
9320: 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74  or occurs,.** st
9330: 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43  ore NULL in *paC
9340: 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43  ol and 0 in *pnC
9350: 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ol and return SQ
9360: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73  LITE_NOMEM..*/.s
9370: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
9380: 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
9390: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
93a0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
93b0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
93c0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
93d0: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  *pEList,       /
93e0: 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d  * Expr list from
93f0: 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76 65   which to derive
9400: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
9410: 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20  .  int *pnCol,  
9420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
9430: 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
9440: 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a  f columns here *
9450: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43  /.  Column **paC
9460: 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ol          /* W
9470: 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c  rite the new col
9480: 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f  umn list here */
9490: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
94a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
94b0: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 63 6e 74 3b    int i, j, cnt;
94c0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c  .  Column *aCol,
94d0: 20 2a 70 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 43   *pCol;.  int nC
94e0: 6f 6c 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  ol;.  Expr *p;. 
94f0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
9500: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 2a 70  int nName;..  *p
9510: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 70 45  nCol = nCol = pE
9520: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 61  List->nExpr;.  a
9530: 43 6f 6c 20 3d 20 2a 70 61 43 6f 6c 20 3d 20 73  Col = *paCol = s
9540: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
9550: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43  ro(db, sizeof(aC
9560: 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20  ol[0])*nCol);.  
9570: 69 66 28 20 61 43 6f 6c 3d 3d 30 20 29 20 72 65  if( aCol==0 ) re
9580: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
9590: 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  M;.  for(i=0, pC
95a0: 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b  ol=aCol; i<nCol;
95b0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
95c0: 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70 70     /* Get an app
95d0: 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66 6f  ropriate name fo
95e0: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  r the column.   
95f0: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c 69   */.    p = pELi
9600: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
9610: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
9620: 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  Right==0 || p->p
9630: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d  Right->token.z==
9640: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d 3e  0 || p->pRight->
9650: 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b  token.z[0]!=0 );
9660: 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20  .    if( (zName 
9670: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
9680: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
9690: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
96a0: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22  mn contains an "
96b0: 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73  AS <name>" phras
96c0: 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73  e, use <name> as
96d0: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
96e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
96f0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
9700: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
9710: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
9720: 6f 6c 20 3d 20 70 3b 0a 20 20 20 20 20 20 54 61  ol = p;.      Ta
9730: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
9740: 20 77 68 69 6c 65 28 20 70 43 6f 6c 2d 3e 6f 70   while( pCol->op
9750: 3d 3d 54 4b 5f 44 4f 54 20 29 20 70 43 6f 6c 20  ==TK_DOT ) pCol 
9760: 3d 20 70 43 6f 6c 2d 3e 70 52 69 67 68 74 3b 0a  = pCol->pRight;.
9770: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
9780: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
9790: 20 28 70 54 61 62 20 3d 20 70 43 6f 6c 2d 3e 70   (pTab = pCol->p
97a0: 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Tab)!=0 ){.     
97b0: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
97c0: 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
97d0: 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
97e0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
97f0: 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a   pCol->iColumn;.
9800: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
9810: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
9820: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
9830: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
9840: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
9850: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9860: 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61     iCol>=0 ? pTa
9870: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
9880: 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29 3b 0a  ame : "rowid");.
9890: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
98a0: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20       /* Use the 
98b0: 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66  original text of
98c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72   the column expr
98d0: 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61  ession as its na
98e0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e  me */.        zN
98f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
9900: 69 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20 26  intf(db, "%T", &
9910: 70 43 6f 6c 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  pCol->span);.   
9920: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
9930: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
9940: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  led ){.      sql
9950: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
9960: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
9970: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ak;.    }.    sq
9980: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
9990: 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  me);..    /* Mak
99a0: 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d  e sure the colum
99b0: 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  n name is unique
99c0: 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69  .  If the name i
99d0: 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20  s not unique,.  
99e0: 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e    ** append a in
99f0: 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d  teger to the nam
9a00: 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63  e so that it bec
9a10: 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20  omes unique..   
9a20: 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20   */.    nName = 
9a30: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20  strlen(zName);. 
9a40: 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20     for(j=cnt=0; 
9a50: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
9a60: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
9a70: 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  Cmp(aCol[j].zNam
9a80: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  e, zName)==0 ){.
9a90: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
9aa0: 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  ewName;.        
9ab0: 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30  zName[nName] = 0
9ac0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61  ;.        zNewNa
9ad0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
9ae0: 6e 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c  ntf(db, "%s:%d",
9af0: 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a   zName, ++cnt);.
9b00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
9b10: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
9b20: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
9b30: 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20  = zNewName;.    
9b40: 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20      j = -1;.    
9b50: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
9b60: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
9b70: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  }.    }.    pCol
9b80: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
9b90: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d  .  }.  if( db->m
9ba0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
9bb0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66 6f     int j;.    fo
9bc0: 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  r(j=0; j<i; j++)
9bd0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
9be0: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a  bFree(db, aCol[j
9bf0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
9c00: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9c10: 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20  e(db, aCol);.   
9c20: 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *paCol = 0;.   
9c30: 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *pnCol = 0;.   
9c40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
9c50: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OMEM;.  }.  retu
9c60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9c70: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20  ./*.** Add type 
9c80: 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
9c90: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63  formation to a c
9ca0: 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64  olumn list based
9cb0: 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20   on.** a SELECT 
9cc0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a  statement..** .*
9cd0: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
9ce0: 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d  t presumably cam
9cf0: 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c  e from selectCol
9d00: 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72  umnNamesFromExpr
9d10: 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63  List()..** The c
9d20: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f  olumn list has o
9d30: 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74  nly names, not t
9d40: 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f  ypes or collatio
9d50: 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ns.  This.** rou
9d60: 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67  tine goes throug
9d70: 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74  h and adds the t
9d80: 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
9d90: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
9da0: 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73  routine requires
9db0: 20 74 68 61 74 20 61 6c 6c 20 69 6e 64 65 6e 74   that all indent
9dc0: 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45  ifiers in the SE
9dd0: 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
9de0: 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  t be resolved..*
9df0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
9e00: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
9e10: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20  eAndCollation(. 
9e20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9e30: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
9e40: 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20  g contexts */.  
9e50: 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  int nCol,       
9e60: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9e70: 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  of columns */.  
9e80: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20  Column *aCol,   
9e90: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
9ea0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53 65   columns */.  Se
9eb0: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
9ec0: 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73      /* SELECT us
9ed0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
9ee0: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
9ef0: 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ions */.){.  sql
9f00: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9f10: 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
9f20: 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75  text sNC;.  Colu
9f30: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c  mn *pCol;.  Coll
9f40: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
9f50: 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  t i;.  Expr *p;.
9f60: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
9f70: 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73  t_item *a;..  as
9f80: 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30  sert( pSelect!=0
9f90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
9fa0: 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
9fb0: 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21   & SF_Resolved)!
9fc0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9fd0: 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70  nCol==pSelect->p
9fe0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20  EList->nExpr || 
9ff0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a000: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
a010: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
a020: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  urn;.  memset(&s
a030: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
a040: 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  C));.  sNC.pSrcL
a050: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
a060: 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65  Src;.  a = pSele
a070: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  ct->pEList->a;. 
a080: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
a090: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  Col; i<nCol; i++
a0a0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70  , pCol++){.    p
a0b0: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
a0c0: 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d     pCol->zType =
a0d0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
a0e0: 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28  (db, columnType(
a0f0: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
a100: 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  ));.    pCol->af
a110: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
a120: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
a130: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
a140: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
a150: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
a160: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
a170: 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d     pCol->zColl =
a180: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
a190: 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  (db, pColl->zNam
a1a0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
a1b0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53  ./*.** Given a S
a1c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
a1d0: 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c   generate a Tabl
a1e0: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
a1f0: 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68   describes.** th
a200: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
a210: 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  that SELECT..*/.
a220: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65  Table *sqlite3Re
a230: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
a240: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
a250: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
a260: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
a270: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a280: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
a290: 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20  t savedFlags;.. 
a2a0: 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62   savedFlags = db
a2b0: 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66  ->flags;.  db->f
a2c0: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
a2d0: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  FullColNames;.  
a2e0: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
a2f0: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
a300: 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  s;.  sqlite3Sele
a310: 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
a320: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
a330: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
a340: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69   return 0;.  whi
a350: 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
a360: 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20  ior ) pSelect = 
a370: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
a380: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73  .  db->flags = s
a390: 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61  avedFlags;.  pTa
a3a0: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
a3b0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
a3c0: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
a3d0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
a3e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
a3f0: 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b    pTab->db = db;
a400: 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20  .  pTab->nRef = 
a410: 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
a420: 20 3d 20 30 3b 0a 20 20 73 65 6c 65 63 74 43 6f   = 0;.  selectCo
a430: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
a440: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
a450: 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  t->pEList, &pTab
a460: 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
a470: 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64  Col);.  selectAd
a480: 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
a490: 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
a4a0: 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62  pTab->nCol, pTab
a4b0: 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 65 63 74 29  ->aCol, pSelect)
a4c0: 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20  ;.  pTab->iPKey 
a4d0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e  = -1;.  if( db->
a4e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
a4f0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
a500: 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a 20 20  eTable(pTab);.  
a510: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
a520: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
a530: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
a540: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
a550: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
a560: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
a570: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
a580: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
a590: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
a5a0: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
a5b0: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
a5c0: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
a5d0: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
a5e0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
a5f0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a600: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
a610: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
a620: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
a630: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
a640: 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e 64  arse->db);.#ifnd
a650: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
a660: 52 41 43 45 0a 20 20 20 20 69 66 28 20 76 20 29  RACE.    if( v )
a670: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
a680: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
a690: 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65  Trace);.    }.#e
a6a0: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
a6b0: 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  n v;.}.../*.** C
a6c0: 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
a6d0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
a6e0: 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
a6f0: 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
a700: 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  ** pLimit and pO
a710: 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  ffset expression
a720: 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  s.  pLimit and p
a730: 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20  Offset hold the 
a740: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
a750: 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
a760: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
a770: 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
a780: 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
a790: 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
a7a0: 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f    Or NULL if tho
a7b0: 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
a7c0: 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20  omitted. iLimit 
a7d0: 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20  and iOffset .** 
a7e0: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
a7f0: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
a800: 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e  numbers for coun
a810: 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
a820: 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d  pute .** the lim
a830: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
a840: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
a850: 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
a860: 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69  et, then .** iLi
a870: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
a880: 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
a890: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a8a0: 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
a8b0: 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e  ues of iLimit an
a8c0: 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
a8d0: 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
a8e0: 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
a8f0: 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20  d by pLimit and 
a900: 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74  pOffset.  iLimit
a910: 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20   and.** iOffset 
a920: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
a930: 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
a940: 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
a950: 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c  alues.** (usuall
a960: 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79 73  y but not always
a970: 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63 61   -1) prior to ca
a980: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
a990: 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70  ne..** Only if p
a9a0: 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66  Limit!=0 or pOff
a9b0: 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  set!=0 do the li
a9c0: 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
a9d0: 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
a9e0: 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
a9f0: 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
aa00: 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
aa10: 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
aa20: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
aa30: 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
aa40: 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
aa50: 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
aa60: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
aa70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
aa80: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
aa90: 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
aaa0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
aab0: 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
aac0: 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
aad0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
aae0: 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
aaf0: 61 64 64 72 31 3b 0a 20 20 69 66 28 20 70 2d 3e  addr1;.  if( p->
ab00: 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b  iLimit ) return;
ab10: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49  ..  /* .  ** "LI
ab20: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
ab30: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
ab40: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
ab50: 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20 61  ** contraversy a
ab60: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
ab70: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
ab80: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
ab90: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
aba0: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
abb0: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
abc0: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
abd0: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ows..  */.  if( 
abe0: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
abf0: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69   p->iLimit = iLi
ac00: 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  mit = ++pParse->
ac10: 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71  nMem;.    v = sq
ac20: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
ac30: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
ac40: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
ac50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ac60: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
ac70: 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  it, iLimit);.   
ac80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ac90: 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
aca0: 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  nt, iLimit);.   
acb0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
acc0: 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
acd0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
ace0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
acf0: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20  IfZero, iLimit, 
ad00: 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20 69  iBreak);.  }.  i
ad10: 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b  f( p->pOffset ){
ad20: 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  .    p->iOffset 
ad30: 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50  = iOffset = ++pP
ad40: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
ad50: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
ad60: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
ad70: 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f  Mem++;   /* Allo
ad80: 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65  cate an extra re
ad90: 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74  gister for limit
ada0: 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 7d  +offset */.    }
adb0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
adc0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
add0: 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
ade0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
adf0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
ae00: 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20  se, p->pOffset, 
ae10: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71  iOffset);.    sq
ae20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ae30: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
ae40: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 56   iOffset);.    V
ae50: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
ae60: 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
ae70: 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  );.    addr1 = s
ae80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
ae90: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f  (v, OP_IfPos, iO
aea0: 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
aeb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
aec0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
aed0: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71  iOffset);.    sq
aee0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
aef0: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
af00: 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
af10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
af20: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
af30: 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66  Add, iLimit, iOf
af40: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29  fset, iOffset+1)
af50: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
af60: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f  ent((v, "LIMIT+O
af70: 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20  FFSET"));.      
af80: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
af90: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
afa0: 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a  IfPos, iLimit);.
afb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
afc0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
afd0: 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73  teger, -1, iOffs
afe0: 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  et+1);.      sql
aff0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
b000: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
b010: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
b020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
b030: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
b040: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70  ** Return the ap
b050: 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74  propriate collat
b060: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
b070: 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
b080: 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65  umn of.** the re
b090: 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65  sult set for the
b0a0: 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
b0b0: 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20   statement "p". 
b0c0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a   Return NULL if.
b0d0: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  ** the column ha
b0e0: 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
b0f0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
b100: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
b110: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
b120: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  r the compound s
b130: 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66  elect is taken f
b140: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d  rom the.** left-
b150: 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  most term of the
b160: 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73   select that has
b170: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
b180: 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  uence..*/.static
b190: 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53   CollSeq *multiS
b1a0: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72  electCollSeq(Par
b1b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
b1c0: 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29  ct *p, int iCol)
b1d0: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65  {.  CollSeq *pRe
b1e0: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
b1f0: 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  or ){.    pRet =
b200: 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
b210: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
b220: 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20  Prior, iCol);.  
b230: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20  }else{.    pRet 
b240: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
b250: 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 52  Ret==0 ){.    pR
b260: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
b270: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
b280: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
b290: 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
b2a0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
b2b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b2c0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
b2d0: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  ELECT */../* For
b2e0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
b2f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
b300: 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
b310: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b320: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
b330: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
b340: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
b350: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
b360: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
b370: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
b380: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
b390: 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
b3a0: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
b3b0: 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
b3c0: 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;...#ifndef SQLI
b3d0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
b3e0: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68  _SELECT./*.** Th
b3f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
b400: 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
b410: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
b420: 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77   form from.** tw
b430: 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
b440: 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67  te queries using
b450: 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c   UNION, UNION AL
b460: 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a  L, EXCEPT, or.**
b470: 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a   INTERSECT.**.**
b480: 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74   "p" points to t
b490: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
b4a0: 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73   the two queries
b4b0: 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20  .  the query on 
b4c0: 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70  the.** left is p
b4d0: 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c  ->pPrior.  The l
b4e0: 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20  eft query could 
b4f0: 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75  also be a compou
b500: 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77  nd query.** in w
b510: 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72  hich case this r
b520: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
b530: 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
b540: 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  y. .**.** The re
b550: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74  sults of the tot
b560: 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20  al query are to 
b570: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
b580: 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a  a destination.**
b590: 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77   of type eDest w
b5a0: 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50  ith parameter iP
b5b0: 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  arm..**.** Examp
b5c0: 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20  le 1:  Consider 
b5d0: 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70  a three-way comp
b5e0: 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65  ound SQL stateme
b5f0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  nt..**.**     SE
b600: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55  LECT a FROM t1 U
b610: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52  NION SELECT b FR
b620: 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
b630: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a  CT c FROM t3.**.
b640: 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
b650: 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61  t is parsed up a
b660: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
b670: 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52       SELECT c FR
b680: 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a  OM t3.**      |.
b690: 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20  **      `-----> 
b6a0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
b6b0: 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  2.**            
b6c0: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
b6d0: 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e          `------>
b6e0: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
b6f0: 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72  t1.**.** The arr
b700: 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72  ows in the diagr
b710: 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65  am above represe
b720: 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50  nt the Select.pP
b730: 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  rior pointer..**
b740: 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
b750: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ine is called wi
b760: 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68  th p equal to th
b770: 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e  e t3 query, then
b780: 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20  .** pPrior will 
b790: 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e  be the t2 query.
b7a0: 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20    p->op will be 
b7b0: 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73  TK_UNION in this
b7c0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   case..**.** Not
b7d0: 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ice that because
b7e0: 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69   of the way SQLi
b7f0: 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75  te parses compou
b800: 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a  nd SELECTs, the.
b810: 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  ** individual se
b820: 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f  lects always gro
b830: 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  up from left to 
b840: 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  right..*/.static
b850: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
b860: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b870: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
b880: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
b890: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
b8a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
b8b0: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
b8c0: 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
b8d0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
b8e0: 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
b8f0: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
b900: 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
b910: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
b920: 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
b930: 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
b940: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
b950: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
b960: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
b970: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
b980: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
b990: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b9b0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
b9c0: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
b9d0: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
b9e0: 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61        /* Alterna
b9f0: 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e  tive data destin
ba00: 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ation */.  Selec
ba10: 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20  t *pDelete = 0; 
ba20: 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d   /* Chain of sim
ba30: 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64  ple selects to d
ba40: 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  elete */.  sqlit
ba50: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
ba60: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
ba70: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  nection */..  /*
ba80: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
ba90: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
baa0: 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  or LIMIT clause 
bab0: 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73  on prior SELECTs
bac0: 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65  .  Only.  ** the
bad0: 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73   last (right-mos
bae0: 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65  t) SELECT in the
baf0: 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76 65   series may have
bb00: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
bb10: 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73  LIMIT..  */.  as
bb20: 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50  sert( p && p->pP
bb30: 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c  rior );  /* Call
bb40: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61  ing function gua
bb50: 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63  rantees this muc
bb60: 68 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  h */.  db = pPar
bb70: 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72  se->db;.  pPrior
bb80: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
bb90: 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
bba0: 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72 69  pRightmost!=pPri
bbb0: 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  or );.  assert( 
bbc0: 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
bbd0: 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73  st==p->pRightmos
bbe0: 74 20 29 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  t );.  dest = *p
bbf0: 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
bc00: 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
bc10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bc20: 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
bc30: 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
bc40: 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
bc50: 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
bc60: 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
bc70: 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
bc80: 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
bc90: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
bca0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
bcb0: 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
bcc0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
bcd0: 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
bce0: 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
bcf0: 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
bd00: 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
bd10: 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
bd20: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
bd30: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
bd40: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
bd50: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
bd60: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
bd70: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
bd80: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72   /* The VDBE alr
bd90: 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20  eady created by 
bda0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
bdb0: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   */..  /* Create
bdc0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
bdd0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
bde0: 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
bdf0: 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
be00: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
be10: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
be20: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
be30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
be40: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
be50: 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 50  hemeral, dest.iP
be60: 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  arm, p->pEList->
be70: 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74  nExpr);.    dest
be80: 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
be90: 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  le;.  }..  /* Ma
bea0: 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45  ke sure all SELE
beb0: 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  CTs in the state
bec0: 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61  ment have the sa
bed0: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  me number of ele
bee0: 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68  ments.  ** in th
bef0: 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e  eir result sets.
bf00: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
bf10: 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
bf20: 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
bf30: 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
bf40: 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70  nExpr!=pPrior->p
bf50: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
bf60: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bf70: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c  Msg(pParse, "SEL
bf80: 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ECTs to the left
bf90: 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73   and right of %s
bfa0: 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74  ".      " do not
bfb0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
bfc0: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
bfd0: 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74  columns", select
bfe0: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
bff0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
c000: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c010: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_end;.  }..  /*
c020: 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   Compound SELECT
c030: 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f  s that have an O
c040: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
c050: 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72  re handled separ
c060: 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
c070: 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
c080: 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
c090: 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70  iSelectOrderBy(p
c0a0: 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
c0b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
c0c0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
c0d0: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
c0e0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c0f0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ts..  */.  switc
c100: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
c110: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
c120: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
c130: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
c140: 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
c150: 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72   );.      pPrior
c160: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c  ->pLimit = p->pL
c170: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
c180: 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
c190: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
c1a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
c1b0: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
c1c0: 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  r, &dest);.     
c1d0: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
c1e0: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
c1f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
c200: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
c210: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
c220: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
c230: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
c240: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
c250: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
c260: 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66  it;.      p->iOf
c270: 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
c280: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
c290: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
c2a0: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
c2b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
c2c0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
c2d0: 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >iLimit);.      
c2e0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
c2f0: 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66  , "Jump ahead if
c300: 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29   LIMIT reached")
c310: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c320: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
c330: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
c340: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 44 65  dest);.      pDe
c350: 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
c360: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
c370: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
c380: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
c390: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
c3a0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
c3b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64   }.      if( add
c3c0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
c3d0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
c3e0: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
c3f0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
c400: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c410: 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
c420: 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
c430: 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
c440: 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
c450: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
c460: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
c470: 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
c480: 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 30        int op = 0
c490: 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;      /* One of
c4a0: 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
c4b0: 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
c4c0: 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
c4d0: 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
c4e0: 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
c4f0: 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
c500: 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
c510: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
c520: 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
c530: 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
c540: 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
c550: 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
c560: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
c570: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
c580: 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
c590: 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54     priorOp = SRT
c5a0: 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
c5b0: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
c5c0: 69 6f 72 4f 70 20 26 26 20 21 70 2d 3e 70 4c 69  iorOp && !p->pLi
c5d0: 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66 73  mit && !p->pOffs
c5e0: 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  et ){.        /*
c5f0: 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20   We can reuse a 
c600: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
c610: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53  generated by a S
c620: 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20  ELECT to our.   
c630: 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20       ** right.. 
c640: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
c650: 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73    unionTab = des
c660: 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  t.iParm;.      }
c670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
c680: 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
c690: 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
c6a0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
c6b0: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
c6c0: 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
c6d0: 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
c6e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c6f0: 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
c700: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
c710: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
c720: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
c730: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
c740: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c750: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
c760: 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
c770: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c780: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
c790: 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
c7a0: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
c7b0: 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
c7c0: 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68          p->pRigh
c7d0: 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20  tmost->selFlags 
c7e0: 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
c7f0: 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ral;.        ass
c800: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
c810: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
c820: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
c830: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
c840: 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
c850: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
c860: 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
c870: 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  rBy );.      sql
c880: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
c890: 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
c8a0: 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
c8b0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
c8c0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
c8d0: 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69  se, pPrior, &uni
c8e0: 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69  ondest);.      i
c8f0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
c900: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
c910: 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
c920: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
c930: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
c940: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
c950: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
c960: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
c970: 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
c980: 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20  SRT_Except;.    
c990: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c9a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
c9b0: 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
c9c0: 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69      op = SRT_Uni
c9d0: 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  on;.      }.    
c9e0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
c9f0: 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
ca00: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
ca10: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
ca20: 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
ca30: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
ca40: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
ca50: 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73  ;.      uniondes
ca60: 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
ca70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ca80: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
ca90: 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
caa0: 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c       /* Query fl
cab0: 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69  attening in sqli
cac0: 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68  te3Select() migh
cad0: 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64  t refill p->pOrd
cae0: 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42  erBy..      ** B
caf0: 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65  e sure to delete
cb00: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68   p->pOrderBy, th
cb10: 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69  erefore, to avoi
cb20: 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e  d a memory leak.
cb30: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
cb40: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
cb50: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
cb60: 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
cb70: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
cb80: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
cb90: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
cba0: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
cbb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
cbc0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
cbd0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
cbe0: 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
cbf0: 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
cc00: 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
cc10: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b    p->iLimit = 0;
cc20: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
cc30: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
cc40: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
cc50: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
cc60: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a  _end;.      }...
cc70: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
cc80: 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
cc90: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
cca0: 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
ccb0: 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
ccc0: 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
ccd0: 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
cce0: 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20 20   */      .      
ccf0: 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d  if( dest.eDest!=
cd00: 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e  priorOp || union
cd10: 54 61 62 21 3d 64 65 73 74 2e 69 50 61 72 6d 20  Tab!=dest.iParm 
cd20: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
cd30: 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53  Cont, iBreak, iS
cd40: 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  tart;.        as
cd50: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
cd60: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
cd70: 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
cd80: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
cd90: 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73     Select *pFirs
cda0: 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  t = p;.         
cdb0: 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e   while( pFirst->
cdc0: 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20  pPrior ) pFirst 
cdd0: 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72  = pFirst->pPrior
cde0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65  ;.          gene
cdf0: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
ce00: 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73  pParse, 0, pFirs
ce10: 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  t->pEList);.    
ce20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42      }.        iB
ce30: 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
ce40: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
ce50: 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
ce60: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
ce70: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
ce80: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
ce90: 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
cea0: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
ceb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cec0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
ced0: 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
cee0: 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53  eak);.        iS
cef0: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
cf00: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
cf10: 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
cf20: 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
cf30: 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
cf40: 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c  unionTab, p->pEL
cf50: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74      0, -1, &dest
cf80: 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
cf90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
cfa0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
cfb0: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
cfc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cfd0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
cfe0: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
cff0: 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  art);.        sq
d000: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d010: 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29  Label(v, iBreak)
d020: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
d030: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d040: 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61  P_Close, unionTa
d050: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
d060: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d070: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
d080: 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20 20  TERSECT: {.     
d090: 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
d0a0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
d0b0: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
d0c0: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
d0d0: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
d0e0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
d0f0: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
d100: 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
d110: 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20        int r1;.. 
d120: 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
d130: 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
d140: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
d150: 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
d160: 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
d170: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
d180: 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
d190: 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
d1a0: 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
d1b0: 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
d1c0: 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
d1d0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
d1e0: 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
d1f0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
d200: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
d210: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ab++;.      asse
d220: 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
d230: 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  =0 );..      add
d240: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
d250: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
d260: 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
d270: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
d280: 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
d290: 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
d2a0: 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
d2b0: 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
d2c0: 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
d2d0: 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ost->selFlags |=
d2e0: 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
d2f0: 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
d300: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20   p->pEList );.. 
d310: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
d320: 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20   SELECTs to our 
d330: 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72  left into tempor
d340: 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31 22  ary table "tab1"
d350: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
d360: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
d370: 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63  stInit(&intersec
d380: 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e  tdest, SRT_Union
d390: 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20 72  , tab1);.      r
d3a0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
d3b0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
d3c0: 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
d3d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
d3e0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
d3f0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
d400: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
d410: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
d420: 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
d430: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
d440: 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
d450: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
d460: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d470: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
d480: 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
d490: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
d4a0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
d4b0: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
d4c0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
d4d0: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
d4e0: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
d4f0: 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
d500: 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
d510: 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
d520: 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
d530: 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
d540: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
d550: 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
d560: 65 73 74 2e 69 50 61 72 6d 20 3d 20 74 61 62 32  est.iParm = tab2
d570: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d580: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
d590: 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74  e, p, &intersect
d5a0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 44 65  dest);.      pDe
d5b0: 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
d5c0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
d5d0: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
d5e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
d5f0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
d600: 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
d610: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
d620: 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
d630: 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
d640: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
d650: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
d660: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
d670: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
d680: 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65  ate code to take
d690: 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f   the intersectio
d6a0: 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d  n of the two tem
d6b0: 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20  porary.      ** 
d6c0: 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f  tables..      */
d6d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d6e0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
d6f0: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
d700: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
d710: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
d720: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
d730: 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
d740: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
d750: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
d760: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e  ior;.        gen
d770: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
d780: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
d790: 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
d7a0: 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61     }.      iBrea
d7b0: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
d7c0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
d7d0: 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74     iCont = sqlit
d7e0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
d7f0: 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  v);.      comput
d800: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
d810: 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
d820: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
d830: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d840: 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20  P_Rewind, tab1, 
d850: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 72  iBreak);.      r
d860: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
d870: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
d880: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
d890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d8a0: 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61  v, OP_RowKey, ta
d8b0: 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  b1, r1);.      s
d8c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d8d0: 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
d8e0: 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31   tab2, iCont, r1
d8f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d900: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
d910: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
d920: 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
d930: 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
d940: 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70 2d  pEList, tab1, p-
d950: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a  >pEList->nExpr,.
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d970: 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65        0, -1, &de
d980: 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
d990: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
d9a0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
d9b0: 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
d9c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d9d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
d9e0: 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 0a   tab1, iStart);.
d9f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
da00: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
da10: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
da20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
da30: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
da40: 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
da50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
da60: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
da70: 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  b1, 0);.      br
da80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
da90: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c    /* Compute col
daa0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
dab0: 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
dac0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20  emporary tables 
dad0: 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d  needed to implem
dae0: 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  ent the compound
daf0: 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74   select..  ** At
db00: 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f  tach the KeyInfo
db10: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c   structure to al
db20: 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  l temporary tabl
db30: 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
db40: 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75  is section is ru
db50: 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d  n by the right-m
db60: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
db70: 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20  ment only..  ** 
db80: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
db90: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c  s to the left al
dba0: 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70  ways skip this p
dbb0: 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d  art.  The right-
dbc0: 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54  most.  ** SELECT
dbd0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70   might also skip
dbe0: 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74   this part if it
dbf0: 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59   has no ORDER BY
dc00: 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a   clause and.  **
dc10: 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20   no temp tables 
dc20: 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20  are required..  
dc30: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
dc40: 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70  lags & SF_UsesEp
dc50: 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69  hemeral ){.    i
dc60: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dc80: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
dc90: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
dca0: 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  yInfo;          
dcb0: 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
dcc0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
dcd0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
dce0: 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b    Select *pLoop;
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74  /* For looping t
dd10: 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74  hrough SELECT st
dd20: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  atements */.    
dd30: 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c  CollSeq **apColl
dd40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
dd50: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
dd60: 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ough pKeyInfo->a
dd70: 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e  Coll[] */.    in
dd80: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
dda0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
ddb0: 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a   in result set *
ddc0: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
ddd0: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 20  ->pRightmost==p 
dde0: 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
ddf0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
de00: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
de10: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
de20: 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20  ro(db,.         
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
de40: 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 2b  zeof(*pKeyInfo)+
de50: 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f 6c  nCol*(sizeof(Col
de60: 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20 20  lSeq*) + 1));.  
de70: 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20    if( !pKeyInfo 
de80: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
de90: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
dea0: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
deb0: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a  ect_end;.    }..
dec0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e      pKeyInfo->en
ded0: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
dee0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
def0: 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66  d = nCol;..    f
df00: 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70  or(i=0, apColl=p
df10: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20  KeyInfo->aColl; 
df20: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43  i<nCol; i++, apC
df30: 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61  oll++){.      *a
df40: 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c  pColl = multiSel
df50: 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
df60: 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
df70: 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29  if( 0==*apColl )
df80: 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c  {.        *apCol
df90: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
dfa0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
dfb0: 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ..    for(pLoop=
dfc0: 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
dfd0: 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a  pLoop->pPrior){.
dfe0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
dff0: 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
e000: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f    int addr = pLo
e010: 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
e020: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
e030: 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20   addr<0 ){.     
e040: 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69       /* If [0] i
e050: 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31  s unused then [1
e060: 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64  ] is also unused
e070: 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20  .  So we can.   
e080: 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
e090: 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73   safely abort as
e0a0: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72   soon as the fir
e0b0: 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69  st unused slot i
e0c0: 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20  s found */.     
e0d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
e0e0: 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
e0f0: 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20  [1]<0 );.       
e100: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e110: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
e120: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
e130: 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a  v, addr, nCol);.
e140: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e150: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
e160: 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65 79  ddr, (char*)pKey
e170: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
e180: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
e190: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
e1a0: 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  ] = -1;.      }.
e1b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e1c0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b 65 79  3DbFree(db, pKey
e1d0: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
e1e0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
e1f0: 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 64 65  pDest->iMem = de
e200: 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44 65 73 74  st.iMem;.  pDest
e210: 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74 2e 6e 4d  ->nMem = dest.nM
e220: 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  em;.  sqlite3Sel
e230: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  ectDelete(db, pD
e240: 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e  elete);.  return
e250: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
e260: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
e270: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
e280: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f  ./*.** Code an o
e290: 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
e2a0: 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65   for a coroutine
e2b0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
e2c0: 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  of a.** SELECT s
e2d0: 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  tatment..**.** T
e2e0: 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75  he data to be ou
e2f0: 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65  tput is containe
e300: 64 20 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d 2e 20  d in pIn->iMem. 
e310: 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49   There are.** pI
e320: 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e 73 20  n->nMem columns 
e330: 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70  to be output.  p
e340: 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74 68  Dest is where th
e350: 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a  e output should.
e360: 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a  ** be sent..**.*
e370: 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20 74  * regReturn is t
e380: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  he number of the
e390: 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   register holdin
e3a0: 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  g the subroutine
e3b0: 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65  .** return addre
e3c0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67  ss..**.** If reg
e3d0: 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69  Prev>0 then it i
e3e0: 73 20 61 20 74 68 65 20 66 69 72 73 74 20 72 65  s a the first re
e3f0: 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74  gister in a vect
e400: 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72  or that.** recor
e410: 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ds the previous 
e420: 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67  output.  mem[reg
e430: 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20  Prev] is a flag 
e440: 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a  that is false.**
e450: 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
e460: 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f  en no previous o
e470: 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72  utput.  If regPr
e480: 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69  ev>0 then code i
e490: 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74  s.** generated t
e4a0: 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69  o suppress dupli
e4b0: 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f  cates.  pKeyInfo
e4c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d   is used for com
e4d0: 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a  paring.** keys..
e4e0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d  **.** If the LIM
e4f0: 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69  IT found in p->i
e500: 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64  Limit is reached
e510: 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
e520: 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e  ly to.** iBreak.
e530: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
e540: 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
e550: 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65  routine(.  Parse
e560: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e570: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
e580: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
e590: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
e5a0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
e5b0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
e5c0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c  SelectDest *pIn,
e5d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75          /* Corou
e5e0: 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64  tine supplying d
e5f0: 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
e600: 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
e610: 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e   /* Where to sen
e620: 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  d the data */.  
e630: 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20  int regReturn,  
e640: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
e650: 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
e660: 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
e670: 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20  regPrev,        
e680: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
e690: 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e  result register.
e6a0: 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20    No uniqueness 
e6b0: 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  if 0 */.  KeyInf
e6c0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
e6d0: 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69    /* For compari
e6e0: 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73  ng with previous
e6f0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
e700: 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  p4type,         
e710: 20 20 20 20 2f 2a 20 54 68 65 20 70 34 20 74 79      /* The p4 ty
e720: 70 65 20 66 6f 72 20 70 4b 65 79 49 6e 66 6f 20  pe for pKeyInfo 
e730: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e750: 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65 20  Jump here if we 
e760: 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f  hit the LIMIT */
e770: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
e780: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
e790: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a   int iContinue;.
e7a0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61    int addr;..  a
e7b0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
e7c0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
e7d0: 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73  .  iContinue = s
e7e0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
e7f0: 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75  bel(v);..  /* Su
e800: 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
e810: 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43  s for UNION, EXC
e820: 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
e830: 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  CT .  */.  if( r
e840: 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e  egPrev ){.    in
e850: 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31  t j1, j2;.    j1
e860: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e870: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
e880: 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
e890: 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j2 = sqlite3Vdbe
e8a0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
e8b0: 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  pare, pIn->iMem,
e8c0: 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
e8d0: 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20  >nMem,.         
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
e900: 49 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b 0a 20  Info, p4type);. 
e910: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e920: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
e930: 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65   j2+2, iContinue
e940: 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71 6c  , j2+2);.    sql
e950: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
e960: 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c  (v, j1);.    sql
e970: 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79  ite3ExprCodeCopy
e980: 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d  (pParse, pIn->iM
e990: 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70  em, regPrev+1, p
e9a0: 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 73  In->nMem);.    s
e9b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e9c0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
e9d0: 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d  1, regPrev);.  }
e9e0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
e9f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ea00: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
ea10: 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20 74  * Suppress the t
ea20: 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
ea30: 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65  entries if there
ea40: 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c   is an OFFSET cl
ea50: 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65  ause.  */.  code
ea60: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f  Offset(v, p, iCo
ea70: 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74  ntinue);..  swit
ea80: 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  ch( pDest->eDest
ea90: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65   ){.    /* Store
eaa0: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
eab0: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
eac0: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
ead0: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
eae0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
eaf0: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
eb00: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
eb10: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
eb20: 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
eb30: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
eb40: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
eb50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
eb60: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
eb70: 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
eb80: 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20  Mem, pIn->nMem, 
eb90: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
eba0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ebb0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65  OP_NewRowid, pDe
ebc0: 73 74 2d 3e 69 50 61 72 6d 2c 20 72 32 29 3b 0a  st->iParm, r2);.
ebd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ebe0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
ebf0: 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61  sert, pDest->iPa
ec00: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
ec10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
ec20: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
ec30: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
ec40: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
ec50: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
ec60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ec70: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
ec80: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
ec90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
eca0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ecb0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
ecc0: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
ecd0: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
ece0: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
ecf0: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
ed00: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
ed10: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
ed20: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
ed30: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
ed40: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
ed50: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
ed60: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
ed70: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
ed80: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
ed90: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t: {.      int r
eda0: 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
edb0: 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b   pIn->nMem==1 );
edc0: 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e 69  .      p->affini
edd0: 74 79 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73  ty = .         s
ede0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
edf0: 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d  inity(p->pEList-
ee00: 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65  >a[0].pExpr, pDe
ee10: 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20  st->affinity);. 
ee20: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
ee30: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
ee40: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
ee50: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
ee60: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
ee70: 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72 31 2c  In->iMem, 1, r1,
ee80: 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31   &p->affinity, 1
ee90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
eea0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
eeb0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
eec0: 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20  pIn->iMem, 1);. 
eed0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eee0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
eef0: 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
ef00: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
ef10: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
ef20: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
ef30: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
ef40: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f  .    }..#if 0  /
ef50: 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20 6f  * Never occurs o
ef60: 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71 75  n an ORDER BY qu
ef70: 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  ery */.    /* If
ef80: 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
ef90: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
efa0: 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
efb0: 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
efc0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
efd0: 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
efe0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
eff0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
f000: 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 50 61  r, 1, pDest->iPa
f010: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
f020: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
f030: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
f040: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
f050: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f060: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
f070: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
f080: 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
f090: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
f0a0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
f0b0: 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
f0c0: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
f0d0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
f0e0: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
f0f0: 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
f100: 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
f110: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
f120: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
f130: 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
f140: 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Mem==1 );.      
f150: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
f160: 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
f170: 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69 50  >iMem, pDest->iP
f180: 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
f190: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
f1a0: 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
f1b0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
f1c0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
f1d0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
f1e0: 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
f1f0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
f200: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
f210: 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
f220: 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
f230: 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
f240: 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
f250: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2e 20 20 54   pDest->iMem.  T
f260: 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  hen the co-routi
f270: 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a  ne yields..    *
f280: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  /.    case SRT_C
f290: 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  oroutine: {.    
f2a0: 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d 65    if( pDest->iMe
f2b0: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
f2c0: 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73 71  pDest->iMem = sq
f2d0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
f2e0: 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
f2f0: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 44  Mem);.        pD
f300: 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d  est->nMem = pIn-
f310: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >nMem;.      }. 
f320: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f330: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
f340: 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73   pIn->iMem, pDes
f350: 74 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e  t->iMem, pDest->
f360: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  nMem);.      sql
f370: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
f380: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
f390: 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  t->iParm);.     
f3a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
f3b0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 61 72     /* Results ar
f3c0: 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
f3d0: 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
f3e0: 65 72 73 2e 20 20 54 68 65 6e 20 74 68 65 0a 20  ers.  Then the. 
f3f0: 20 20 20 2a 2a 20 4f 50 5f 52 65 73 75 6c 74 52     ** OP_ResultR
f400: 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  ow opcode is use
f410: 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74  d to cause sqlit
f420: 65 33 5f 73 74 65 70 28 29 20 74 6f 20 72 65 74  e3_step() to ret
f430: 75 72 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e  urn.    ** the n
f440: 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  ext row of resul
f450: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
f460: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
f470: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f480: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
f490: 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69  esultRow, pIn->i
f4a0: 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b  Mem, pIn->nMem);
f4b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
f4c0: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
f4d0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
f4e0: 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d  n->iMem, pIn->nM
f4f0: 65 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  em);.      break
f500: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65  ;.    }..#if !de
f510: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
f520: 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f  T_TRIGGER).    /
f530: 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65  * Discard the re
f540: 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20  sults.  This is 
f550: 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20  used for SELECT 
f560: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64  statements insid
f570: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64  e.    ** the bod
f580: 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20  y of a TRIGGER. 
f590: 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
f5a0: 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20  such selects is 
f5b0: 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75  to call.    ** u
f5c0: 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
f5d0: 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  tions that have 
f5e0: 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57  side effects.  W
f5f0: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20  e do not care.  
f600: 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61    ** about the a
f610: 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66  ctual results of
f620: 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20   the select..   
f630: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
f640: 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   {.      break;.
f650: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
f660: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
f670: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
f680: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
f690: 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
f6a0: 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
f6b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
f6c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f6d0: 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69  AddImm, p->iLimi
f6e0: 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  t, -1);.    sqli
f6f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f700: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
f710: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a  Limit, iBreak);.
f720: 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
f730: 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  te the subroutin
f740: 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  e return.  */.  
f750: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
f760: 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
f770: 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
f780: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
f790: 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75  _Return, regRetu
f7a0: 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61  rn);..  return a
f7b0: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ddr;.}../*.** Al
f7c0: 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75  ternative compou
f7d0: 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67  nd select code g
f7e0: 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73  enerator for cas
f7f0: 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a  es when there.**
f800: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
f810: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65  clause..**.** We
f820: 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20   assume a query 
f830: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
f840: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
f850: 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70    <selectA>  <op
f860: 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74  erator>  <select
f870: 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72  B>  ORDER BY <or
f880: 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a  derbylist>.**.**
f890: 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f   <operator> is o
f8a0: 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c  ne of UNION ALL,
f8b0: 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
f8c0: 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54  or INTERSECT.  T
f8d0: 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f  he idea.** is to
f8e0: 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65   code both <sele
f8f0: 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74  ctA> and <select
f900: 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45  B> with the ORDE
f910: 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a  R BY clause as.*
f920: 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20  * co-routines.  
f930: 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d  Then run the co-
f940: 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61  routines in para
f950: 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74  llel and merge t
f960: 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
f970: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20  to the output.  
f980: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  In addition to t
f990: 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
f9a0: 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74  s (called select
f9b0: 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42  A and.** selectB
f9c0: 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75  ) there are 7 su
f9d0: 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a  broutines:.**.**
f9e0: 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76      outA:    Mov
f9f0: 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
fa00: 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f  the selectA coro
fa10: 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
fa20: 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
fa30: 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
fa40: 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a  ound query..**.*
fa50: 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f  *    outB:    Mo
fa60: 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
fa70: 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72   the selectB cor
fa80: 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
fa90: 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
faa0: 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
fab0: 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f  pound query.  (O
fac0: 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
fad0: 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20  r UNION and.**  
fae0: 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
faf0: 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e   ALL.  EXCEPT an
fb00: 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76  d INSERTSECT nev
fb10: 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20  er output a row 
fb20: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
fb30: 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79      appears only
fb40: 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20   in B.).**.**   
fb50: 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AltB:    Called
fb60: 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
fb70: 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
fb80: 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42  routines and A<B
fb90: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a  ..**.**    AeqB:
fba0: 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
fbb0: 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
fbc0: 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
fbd0: 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a  es and A==B..**.
fbe0: 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43  **    AgtB:    C
fbf0: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
fc00: 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
fc10: 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
fc20: 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A>B..**.**    
fc30: 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofA:    Called 
fc40: 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
fc50: 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
fc60: 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  ctA..**.**    Eo
fc70: 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fB:    Called wh
fc80: 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
fc90: 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
fca0: 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  B..**.** The imp
fcb0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
fcc0: 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73  he latter five s
fcd0: 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e  ubroutines depen
fce0: 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c  d on which .** <
fcf0: 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65  operator> is use
fd00: 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d:.**.**.**     
fd10: 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
fd20: 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  L         UNION 
fd30: 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50             EXCEP
fd40: 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52  T          INTER
fd50: 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  SECT.**         
fd60: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20   -------------  
fd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd80: 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
fd90: 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
fda0: 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20  ----.**   AltB: 
fdb0: 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
fdc0: 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
fdd0: 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
fde0: 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a           nextA.*
fdf0: 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f  *.**   AeqB:   o
fe00: 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
fe10: 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
fe20: 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
fe30: 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a     outA, nextA.*
fe40: 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f  *.**   AgtB:   o
fe50: 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
fe60: 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
fe70: 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20       nextB      
fe80: 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a        nextB.**.*
fe90: 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42  *   EofA:   outB
fea0: 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
feb0: 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
fec0: 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20    halt          
fed0: 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20     halt.**.**   
fee0: 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  EofB:   outA, ne
fef0: 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
ff00: 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
ff10: 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68   nextA         h
ff20: 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  alt.**.** In the
ff30: 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64   AltB, AeqB, and
ff40: 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65   AgtB subroutine
ff50: 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66  s, an EOF on A f
ff60: 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a  ollowing nextA.*
ff70: 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65  * causes an imme
ff80: 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
ff90: 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e  fA and an EOF on
ffa0: 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   B following nex
ffb0: 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20  tB causes.** an 
ffc0: 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
ffd0: 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20  o EofB.  Within 
ffe0: 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61  EofA and EofB, a
fff0: 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20  nd EOF on entry 
10000 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  or.** following 
10010 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a  nextX causes a j
10020 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
10030 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f  f the select pro
10040 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44  cessing..**.** D
10050 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
10060 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45   in the UNION, E
10070 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
10080 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61  SECT cases is ha
10090 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ndled.** within 
100a0 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
100b0 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50  utine.  The regP
100c0 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74  rev register set
100d0 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69   holds the previ
100e0 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20  ously.** output 
100f0 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72  value.  A compar
10100 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61  ison is made aga
10110 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20  inst this value 
10120 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
10130 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  * is skipped if 
10140 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73  the next results
10150 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61   would be the sa
10160 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  me as the previo
10170 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  us..**.** The im
10180 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61  plementation pla
10190 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  n is to implemen
101a0 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  t the two corout
101b0 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a  ines and seven.*
101c0 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69  * subroutines fi
101d0 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68  rst, then put th
101e0 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20  e control logic 
101f0 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20  at the bottom.  
10200 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
10210 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49            goto I
10220 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20  nit.**     coA: 
10230 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
10240 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20  ft query (A).** 
10250 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69      coB: corouti
10260 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65  ne for right que
10270 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74  ry (B).**    out
10280 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  A: output one ro
10290 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74  w of A.**    out
102a0 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  B: output one ro
102b0 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e  w of B (UNION an
102c0 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79  d UNION ALL only
102d0 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e  ).**    EofA: ..
102e0 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e  ..**    EofB: ..
102f0 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e  ..**    AltB: ..
10300 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e  ..**    AeqB: ..
10310 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e  ..**    AgtB: ..
10320 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e  ..**    Init: in
10330 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69  itialize corouti
10340 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  ne registers.** 
10350 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
10360 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oA.**          i
10370 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f  f eof(A) goto Eo
10380 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  fA.**          y
10390 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20  ield coB.**     
103a0 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67       if eof(B) g
103b0 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43  oto EofB.**    C
103c0 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20  mpr: Compare A, 
103d0 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75  B.**          Ju
103e0 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  mp AltB, AeqB, A
103f0 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20  gtB.**     End: 
10400 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c  ....**.** We cal
10410 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  l AltB, AeqB, Ag
10420 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f  tB, EofA, and Eo
10430 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22  fB "subroutines"
10440 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f   but they are no
10450 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61  t.** actually ca
10460 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62  lled using Gosub
10470 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74   and they do not
10480 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61   Return.  EofA a
10490 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20  nd EofB loop.** 
104a0 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69  until all data i
104b0 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e  s exhausted then
104c0 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e   jump to the "en
104d0 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20  d" labe.  AltB, 
104e0 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74  AeqB,.** and Agt
104f0 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72  B jump to either
10500 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66   L2 or to one of
10510 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a   EofA or EofB..*
10520 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
10530 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
10540 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74  ELECT.static int
10550 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
10560 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
10570 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
10580 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
10590 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
105a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
105b0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
105c0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
105d0 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
105e0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
105f0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
10600 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
10610 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
10620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10630 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
10640 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
10650 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
10660 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
10670 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
10680 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
10690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
106a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
106b0 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
106c0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
106d0 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tA;     /* Desti
106e0 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
106f0 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65  tine A */.  Sele
10700 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20  ctDest destB;   
10710 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
10720 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42   for coroutine B
10730 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
10740 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rA;         /* A
10750 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
10760 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  for select-A cor
10770 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10780 72 65 67 45 6f 66 41 3b 20 20 20 20 20 20 20 20  regEofA;        
10790 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64    /* Flag to ind
107a0 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63  icate when selec
107b0 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65 74 65 20  t-A is complete 
107c0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
107d0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
107e0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
107f0 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f  or select-B coro
10800 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
10810 65 67 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  egEofB;         
10820 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69   /* Flag to indi
10830 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74  cate when select
10840 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a  -B is complete *
10850 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
10860 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctA;      /* Add
10870 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
10880 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
10890 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
108a0 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctB;      /* Add
108b0 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
108c0 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
108d0 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b  /.  int regOutA;
108e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
108f0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
10900 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  r the output-A s
10910 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
10920 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20  nt regOutB;     
10930 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10940 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
10950 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
10960 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
10970 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  drOutA;         
10980 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
10990 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
109a0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
109b0 64 64 72 4f 75 74 42 3b 20 20 20 20 20 20 20 20  ddrOutB;        
109c0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
109d0 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
109e0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
109f0 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20  addrEofA;       
10a00 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10a10 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68  the select-A-exh
10a20 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
10a30 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
10a40 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofB;         /* 
10a50 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
10a60 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65  elect-B-exhauste
10a70 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
10a80 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20    int addrAltB; 
10a90 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
10aa0 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75  ss of the A<B su
10ab0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
10ac0 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20  t addrAeqB;     
10ad0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
10ae0 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f  f the A==B subro
10af0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
10b00 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20  ddrAgtB;        
10b10 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
10b20 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e  he A>B subroutin
10b30 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  e */.  int regLi
10b40 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitA;        /* 
10b50 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
10b60 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
10b70 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20   int regLimitB; 
10b80 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
10b90 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
10ba0 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
10bb0 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
10bc0 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72   /* A range of r
10bd0 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64  egisters to hold
10be0 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
10bf0 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c   */.  int savedL
10c00 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
10c10 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
10c20 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74  >iLimit */.  int
10c30 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20   savedOffset;   
10c40 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
10c50 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20  e of p->iOffset 
10c60 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d  */.  int labelCm
10c70 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  pr;        /* La
10c80 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72  bel for the star
10c90 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61  t of the merge a
10ca0 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e  lgorithm */.  in
10cb0 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20  t labelEnd;     
10cc0 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
10cd0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
10ce0 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73  overall SELECT s
10cf0 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b  tmt */.  int j1;
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10d10 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  * Jump instructi
10d20 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74  ons that get ret
10d30 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e  argetted */.  in
10d40 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
10d50 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
10d60 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20  _ALL, TK_UNION, 
10d70 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e  TK_EXCEPT, TK_IN
10d80 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79  TERSECT */.  Key
10d90 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20  Info *pKeyDup = 
10da0 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e  0; /* Comparison
10db0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
10dc0 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   duplicate remov
10dd0 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  al */.  KeyInfo 
10de0 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a  *pKeyMerge;   /*
10df0 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f   Comparison info
10e00 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67  rmation for merg
10e10 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71  ing rows */.  sq
10e20 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
10e30 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
10e40 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
10e50 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
10e60 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
10e70 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
10e80 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
10e90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10ea0 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
10eb0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
10ec0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72  e */.  int *aPer
10ed0 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  mute;        /* 
10ee0 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44  Mapping from ORD
10ef0 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72  ER BY terms to r
10f00 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
10f10 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
10f20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29  p->pOrderBy!=0 )
10f30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
10f40 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61  Dup==0 ); /* "Ma
10f50 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64  naged" code need
10f60 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20  s this.  Ticket 
10f70 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d  #3382. */.  db =
10f80 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
10f90 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
10fa0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
10fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
10fc0 45 4d 3b 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d  EM;.  labelEnd =
10fd0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
10fe0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65  Label(v);.  labe
10ff0 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56  lCmpr = sqlite3V
11000 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11010 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70  ...  /* Patch up
11020 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
11030 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d  ause.  */.  op =
11040 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69   p->op;  .  pPri
11050 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
11060 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
11070 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
11080 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  .  pOrderBy = p-
11090 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73  >pOrderBy;.  ass
110a0 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b  ert( pOrderBy );
110b0 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
110c0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a  rderBy->nExpr;..
110d0 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f    /* For operato
110e0 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  rs other than UN
110f0 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20  ION ALL we have 
11100 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
11110 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52  t.  ** the ORDER
11120 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72   BY clause cover
11130 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  s every term of 
11140 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
11150 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20   Add.  ** terms 
11160 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
11170 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73 73  clause as necess
11180 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
11190 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op!=TK_ALL ){.  
111a0 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d    for(i=1; db->m
111b0 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26  allocFailed==0 &
111c0 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  & i<=p->pEList->
111d0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
111e0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
111f0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
11200 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
11210 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
11220 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b  ; j<nOrderBy; j+
11230 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
11240 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
11250 65 6d 2d 3e 69 43 6f 6c 3e 30 20 29 3b 0a 20 20  em->iCol>0 );.  
11260 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
11270 3e 69 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  >iCol==i ) break
11280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11290 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
112a0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
112b0 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50  *pNew = sqlite3P
112c0 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
112d0 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 30  INTEGER, 0, 0, 0
112e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
112f0 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
11300 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
11310 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
11320 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  s |= EP_IntValue
11330 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
11340 69 54 61 62 6c 65 20 3d 20 69 3b 0a 20 20 20 20  iTable = i;.    
11350 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 73      pOrderBy = s
11360 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
11370 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72  pend(pParse, pOr
11380 64 65 72 42 79 2c 20 70 4e 65 77 2c 20 30 29 3b  derBy, pNew, 0);
11390 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
113a0 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
113b0 2e 69 43 6f 6c 20 3d 20 69 3b 0a 20 20 20 20 20  .iCol = i;.     
113c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
113d0 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
113e0 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
113f0 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
11400 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
11410 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
11420 6d 75 74 61 74 69 6f 6e 20 69 6e 20 6f 72 64 65  mutation in orde
11430 72 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 73  r to comparisons
11440 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
11450 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
11460 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
11470 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
11480 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
11490 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
114a0 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
114b0 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
114c0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
114d0 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
114e0 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
114f0 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
11500 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
11510 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
11520 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
11530 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
11540 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
11550 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
11560 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
11570 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  *nOrderBy);.  if
11580 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
11590 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
115a0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
115b0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
115c0 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
115d0 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20  <nOrderBy; i++, 
115e0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
115f0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69  assert( pItem->i
11600 43 6f 6c 3e 30 20 20 26 26 20 70 49 74 65 6d 2d  Col>0  && pItem-
11610 3e 69 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74  >iCol<=p->pEList
11620 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ->nExpr );.     
11630 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70   aPermute[i] = p
11640 49 74 65 6d 2d 3e 69 43 6f 6c 20 2d 20 31 3b 0a  Item->iCol - 1;.
11650 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65      }.    pKeyMe
11660 72 67 65 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  rge =.      sqli
11670 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
11680 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 4d  b, sizeof(*pKeyM
11690 65 72 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a 28  erge)+nOrderBy*(
116a0 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
116b0 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  +1));.    if( pK
116c0 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20  eyMerge ){.     
116d0 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72   pKeyMerge->aSor
116e0 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
116f0 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b  KeyMerge->aColl[
11700 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 20  nOrderBy];.     
11710 20 70 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69 65   pKeyMerge->nFie
11720 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  ld = nOrderBy;. 
11730 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e       pKeyMerge->
11740 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
11750 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11760 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
11770 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
11780 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
11790 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f  Expr *pTerm = pO
117a0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
117b0 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
117c0 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45  pTerm->flags & E
117d0 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  P_ExpCollate ){.
117e0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
117f0 3d 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a  = pTerm->pColl;.
11800 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
11810 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
11820 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
11830 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 61  Seq(pParse, p, a
11840 50 65 72 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20  Permute[i]);.   
11850 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c         pTerm->fl
11860 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c  ags |= EP_ExpCol
11870 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20  late;.          
11880 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pTerm->pColl = p
11890 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Coll;.        }.
118a0 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67          pKeyMerg
118b0 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43  e->aColl[i] = pC
118c0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b 65  oll;.        pKe
118d0 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64  yMerge->aSortOrd
118e0 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
118f0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
11900 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
11920 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  yMerge = 0;.  }.
11930 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74  .  /* Reattach t
11940 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11950 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e  se to the query.
11960 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  .  */.  p->pOrde
11970 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
11980 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
11990 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
119a0 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e  ListDup(pParse->
119b0 64 62 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a  db, pOrderBy);..
119c0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
119d0 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72 61  range of tempora
119e0 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ry registers and
119f0 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65   the KeyInfo nee
11a00 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ded.  ** for the
11a10 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d 6f   logic that remo
11a20 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72 65  ves duplicate re
11a30 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20 74  sult rows when t
11a40 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  he.  ** operator
11a50 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50   is UNION, EXCEP
11a60 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 20  T, or INTERSECT 
11a70 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41  (but not UNION A
11a80 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  LL)..  */.  if( 
11a90 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
11aa0 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a 20    regPrev = 0;. 
11ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
11ac0 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  nExpr = p->pELis
11ad0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 73  t->nExpr;.    as
11ae0 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d  sert( nOrderBy>=
11af0 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
11b00 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
11b10 20 72 65 67 50 72 65 76 20 3d 20 73 71 6c 69 74   regPrev = sqlit
11b20 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
11b30 50 61 72 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b  Parse, nExpr+1);
11b40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11b50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
11b60 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76  eger, 0, regPrev
11b70 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d  );.    pKeyDup =
11b80 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
11b90 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20  Zero(db,.       
11ba0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
11bb0 66 28 2a 70 4b 65 79 44 75 70 29 20 2b 20 6e 45  f(*pKeyDup) + nE
11bc0 78 70 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  xpr*(sizeof(Coll
11bd0 53 65 71 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20  Seq*)+1) );.    
11be0 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a 20  if( pKeyDup ){. 
11bf0 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53       pKeyDup->aS
11c00 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
11c10 26 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b  &pKeyDup->aColl[
11c20 6e 45 78 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b  nExpr];.      pK
11c30 65 79 44 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  eyDup->nField = 
11c40 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4b 65  nExpr;.      pKe
11c50 79 44 75 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  yDup->enc = ENC(
11c60 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  db);.      for(i
11c70 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
11c80 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  ){.        pKeyD
11c90 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  up->aColl[i] = m
11ca0 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
11cb0 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
11cc0 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
11cd0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
11ce0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
11cf0 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65   }.  }. .  /* Se
11d00 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20  parate the left 
11d10 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75  and the right qu
11d20 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f  ery from one ano
11d30 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ther.  */.  p->p
11d40 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72  Prior = 0;.  pPr
11d50 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20  ior->pRightmost 
11d60 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  = 0;.  sqlite3Re
11d70 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
11d80 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  y(pParse, p, p->
11d90 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
11da0 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  ");.  if( pPrior
11db0 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
11dc0 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
11dd0 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
11de0 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50  arse, pPrior, pP
11df0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rior->pOrderBy, 
11e00 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20  "ORDER");.  }.. 
11e10 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
11e20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
11e30 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
11e40 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
11e50 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  e, p, labelEnd);
11e60 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
11e70 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   && op==TK_ALL )
11e80 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
11e90 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
11ea0 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20  ;.    regLimitB 
11eb0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
11ec0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11ed0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
11ee0 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f  py, p->iOffset ?
11ef0 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20   p->iOffset+1 : 
11f00 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20  p->iLimit,.     
11f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
11f30 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c  LimitA);.    sql
11f40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11f50 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69  , OP_Copy, regLi
11f60 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29  mitA, regLimitB)
11f70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
11f80 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69  egLimitA = regLi
11f90 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  mitB = 0;.  }.  
11fa0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
11fb0 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
11fc0 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
11fd0 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
11fe0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
11ff0 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66  ffset);.  p->pOf
12000 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67  fset = 0;..  reg
12010 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65  AddrA = ++pParse
12020 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66  ->nMem;.  regEof
12030 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
12040 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d  em;.  regAddrB =
12050 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
12060 0a 20 20 72 65 67 45 6f 66 42 20 3d 20 2b 2b 70  .  regEofB = ++p
12070 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
12080 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73  egOutA = ++pPars
12090 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
120a0 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
120b0 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Mem;.  sqlite3Se
120c0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
120d0 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stA, SRT_Corouti
120e0 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ne, regAddrA);. 
120f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
12100 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53  stInit(&destB, S
12110 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
12120 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a  gAddrB);..  /* J
12130 75 6d 70 20 70 61 73 74 20 74 68 65 20 76 61 72  ump past the var
12140 69 6f 75 73 20 73 75 62 72 6f 75 74 69 6e 65 73  ious subroutines
12150 20 61 6e 64 20 63 6f 72 6f 75 74 69 6e 65 73 20   and coroutines 
12160 74 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a  to the main.  **
12170 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
12180 0a 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56  .  j1 = sqlite3V
12190 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
121a0 47 6f 74 6f 29 3b 0a 20 20 61 64 64 72 53 65 6c  Goto);.  addrSel
121b0 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64  ectA = sqlite3Vd
121c0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
121d0 3b 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  ;...  /* Generat
121e0 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
121f0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
12200 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
12210 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20  o the.  ** left 
12220 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
12230 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22  operator - the "
12240 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  A" select..  */.
12250 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12260 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72  t((v, "Begin cor
12270 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20  outine for left 
12280 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72  SELECT"));.  pPr
12290 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65  ior->iLimit = re
122a0 67 4c 69 6d 69 74 41 3b 0a 20 20 73 71 6c 69 74  gLimitA;.  sqlit
122b0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
122c0 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29   pPrior, &destA)
122d0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
122e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
122f0 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 41 29  ger, 1, regEofA)
12300 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12310 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
12320 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
12330 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
12340 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69  (v, "End corouti
12350 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45  ne for left SELE
12360 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  CT"));..  /* Gen
12370 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
12380 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
12390 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
123a0 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20  nt on .  ** the 
123b0 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20  right - the "B" 
123c0 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64  select.  */.  ad
123d0 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69  drSelectB = sqli
123e0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
123f0 64 72 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  dr(v);.  VdbeNoo
12400 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  pComment((v, "Be
12410 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  gin coroutine fo
12420 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29  r right SELECT")
12430 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
12440 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
12450 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
12460 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
12470 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
12480 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
12490 20 30 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 53   0;  .  sqlite3S
124a0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
124b0 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69   &destB);.  p->i
124c0 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d  Limit = savedLim
124d0 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  it;.  p->iOffset
124e0 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a   = savedOffset;.
124f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12500 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
12510 72 2c 20 31 2c 20 72 65 67 45 6f 66 42 29 3b 0a  r, 1, regEofB);.
12520 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12530 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
12540 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 56 64   regAddrB);.  Vd
12550 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
12560 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65  , "End coroutine
12570 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43   for right SELEC
12580 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  T"));..  /* Gene
12590 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
125a0 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
125b0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
125c0 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c  f the A.  ** sel
125d0 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
125e0 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
125f0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
12600 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  t..  */.  VdbeNo
12610 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
12620 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
12630 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75  r A"));.  addrOu
12640 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tA = generateOut
12650 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
12660 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
12670 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41         p, &destA
12680 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41  , pDest, regOutA
12690 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
126a0 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
126b0 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  Dup, P4_KEYINFO_
126c0 48 41 4e 44 4f 46 46 2c 20 6c 61 62 65 6c 45 6e  HANDOFF, labelEn
126d0 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65  d);.  .  /* Gene
126e0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
126f0 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
12700 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
12710 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c  f the B.  ** sel
12720 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
12730 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
12740 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
12750 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  t..  */.  if( op
12760 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
12770 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
12780 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
12790 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74  (v, "Output rout
127a0 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20  ine for B"));.  
127b0 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e    addrOutB = gen
127c0 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
127d0 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
127e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
127f0 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c  , &destB, pDest,
12800 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20   regOutB,.      
12810 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
12820 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50 34 5f  ev, pKeyDup, P4_
12830 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 2c 20  KEYINFO_STATIC, 
12840 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 0a  labelEnd);.  }..
12850 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
12860 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
12870 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
12880 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41  ts from select A
12890 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
128a0 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
128b0 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65  a in select B re
128c0 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56 64  mains..  */.  Vd
128d0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
128e0 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74  , "eof-A subrout
128f0 69 6e 65 22 29 29 3b 0a 20 20 69 66 28 20 6f 70  ine"));.  if( op
12900 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f  ==TK_EXCEPT || o
12910 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
12920 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20  ){.    addrEofA 
12930 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12940 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
12950 30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  0, labelEnd);.  
12960 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 61 64 64  }else{  .    add
12970 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
12980 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12990 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 6c 61 62  If, regEofB, lab
129a0 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69  elEnd);.    sqli
129b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
129c0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
129d0 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
129e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
129f0 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
12a00 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 20  , regAddrB);.   
12a10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12a20 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
12a30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 7d  , addrEofA);.  }
12a40 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
12a50 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
12a60 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
12a70 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
12a80 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   B.  ** are exha
12a90 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
12aa0 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20  ata in select A 
12ab0 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
12ac0 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
12ad0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
12ae0 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b  EofB = addrEofA;
12af0 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
12b00 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
12b10 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f  (v, "eof-B subro
12b20 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
12b30 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33  drEofB = sqlite3
12b40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12b50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61  _If, regEofA, la
12b60 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c  belEnd);.    sql
12b70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12b80 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
12b90 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
12ba0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12bb0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
12bc0 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
12bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12be0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
12bf0 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20  0, addrEofB);.  
12c00 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
12c10 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
12c20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a  the case of A<B.
12c30 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
12c40 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74  omment((v, "A-lt
12c50 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
12c60 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73  ;.  addrAltB = s
12c70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12c80 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
12c90 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29  gOutA, addrOutA)
12ca0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12cb0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
12cc0 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
12cd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12ce0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
12cf0 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  ofA, addrEofA);.
12d00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12d10 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
12d20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
12d30 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
12d40 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
12d50 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20   case of A==B.  
12d60 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
12d70 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ALL ){.    addrA
12d80 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
12d90 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
12da0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
12db0 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
12dc0 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64  ddrAltB;.    add
12dd0 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rAltB++;.  }else
12de0 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
12df0 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d  mment((v, "A-eq-
12e00 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
12e10 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a  .    addrAeqB =.
12e20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12e30 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
12e40 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  d, regAddrA);.  
12e50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12e60 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
12e70 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29  gEofA, addrEofA)
12e80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12e90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
12ea0 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
12eb0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
12ec0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
12ed0 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
12ee0 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A>B.  */.  Vdbe
12ef0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
12f00 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-gt-B subrouti
12f10 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74  ne"));.  addrAgt
12f20 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
12f30 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
12f40 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
12f50 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
12f60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
12f70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
12f80 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
12f90 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20  ddrOutB);.  }.  
12fa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12fb0 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
12fc0 65 67 41 64 64 72 42 29 3b 0a 20 20 73 71 6c 69  egAddrB);.  sqli
12fd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12fe0 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
12ff0 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 73 71   addrEofB);.  sq
13000 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13010 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
13020 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
13030 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20   This code runs 
13040 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  once to initiali
13050 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20  ze everything.. 
13060 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
13070 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
13080 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13090 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
130a0 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 41 29  ger, 0, regEofA)
130b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
130c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
130d0 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 42 29  ger, 0, regEofB)
130e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
130f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
13100 62 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  b, regAddrA, add
13110 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c  rSelectA);.  sql
13120 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13130 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41  , OP_Gosub, regA
13140 64 64 72 42 2c 20 61 64 64 72 53 65 6c 65 63 74  ddrB, addrSelect
13150 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
13160 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
13170 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
13180 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
13190 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
131a0 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64  If, regEofB, add
131b0 72 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d  rEofB);..  /* Im
131c0 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e  plement the main
131d0 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
131e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
131f0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
13200 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69  belCmpr);.  sqli
13210 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
13220 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c   OP_Permutation,
13230 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a   0, 0, 0, (char*
13240 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e  )aPermute, P4_IN
13250 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74  TARRAY);.  sqlit
13260 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
13270 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74  OP_Compare, dest
13280 41 2e 69 4d 65 6d 2c 20 64 65 73 74 42 2e 69 4d  A.iMem, destB.iM
13290 65 6d 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  em, nOrderBy,.  
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
132c0 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49  eyMerge, P4_KEYI
132d0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
132e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
132f0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
13300 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42  drAltB, addrAeqB
13310 2c 20 61 64 64 72 41 67 74 42 29 3b 0a 0a 20 20  , addrAgtB);..  
13320 2f 2a 20 52 65 6c 65 61 73 65 20 74 65 6d 70 6f  /* Release tempo
13330 72 61 72 79 20 72 65 67 69 73 74 65 72 73 0a 20  rary registers. 
13340 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
13350 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
13360 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
13370 28 70 50 61 72 73 65 2c 20 72 65 67 50 72 65 76  (pParse, regPrev
13380 2c 20 6e 4f 72 64 65 72 42 79 2b 31 29 3b 0a 20  , nOrderBy+1);. 
13390 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
133a0 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20   the this point 
133b0 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d  in order to term
133c0 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e  inate the query.
133d0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
133e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
133f0 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20  v, labelEnd);.. 
13400 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
13410 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c  er of output col
13420 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
13430 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
13440 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
13450 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
13460 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69   pPrior;.    whi
13470 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
13480 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
13490 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
134a0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
134b0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
134c0 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
134d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73  ;.  }..  /* Reas
134e0 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f  sembly the compo
134f0 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61  und query so tha
13500 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  t it will be fre
13510 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
13520 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
13530 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
13540 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
13550 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
13560 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
13570 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d  Prior);.  }.  p-
13580 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
13590 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20  ;..  /*** TBD:  
135a0 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e  Insert subroutin
135b0 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65  e calls to close
135c0 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f   cursors on inco
135d0 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75  mplete.  **** su
135e0 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20  bqueries ****/. 
135f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13600 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
13610 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13620 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
13630 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
13640 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
13650 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61   Forward Declara
13660 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
13670 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
13680 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70  st(sqlite3*, Exp
13690 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70  rList*, int, Exp
136a0 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
136b0 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
136c0 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63  (sqlite3*, Selec
136d0 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  t *, int, ExprLi
136e0 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63  st *);../*.** Sc
136f0 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
13700 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
13710 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
13720 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
13730 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
13740 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
13750 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
13760 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
13770 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
13780 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
13790 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
137a0 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
137b0 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
137c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
137d0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
137e0 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
137f0 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
13800 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
13810 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
13820 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
13830 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
13840 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
13850 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
13860 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
13870 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
13880 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
13890 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
138a0 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
138b0 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
138c0 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
138d0 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
138e0 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
138f0 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
13900 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
13910 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
13920 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
13930 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
13940 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
13950 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 28   void substExpr(
13960 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
13970 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
13980 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74   malloc errors t
13990 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  o this connectio
139a0 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
139b0 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78  pr,        /* Ex
139c0 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62 73  pr in which subs
139d0 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  titution occurs 
139e0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
139f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
13a00 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
13a10 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
13a20 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
13a30 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72 65  Substitute expre
13a40 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69  ssions */.){.  i
13a50 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
13a60 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70  turn;.  if( pExp
13a70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
13a80 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
13a90 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  e==iTable ){.   
13aa0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
13ab0 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  umn<0 ){.      p
13ac0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
13ad0 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
13ae0 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b       Expr *pNew;
13af0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13b00 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70  EList!=0 && pExp
13b10 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73  r->iColumn<pELis
13b20 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
13b30 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
13b40 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
13b50 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 26 26  pr->pRight==0 &&
13b60 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30   pExpr->pList==0
13b70 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
13b80 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72   pEList->a[pExpr
13b90 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
13ba0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13bb0 70 4e 65 77 21 3d 30 20 29 3b 0a 20 20 20 20 20  pNew!=0 );.     
13bc0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65   pExpr->op = pNe
13bd0 77 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 61 73 73  w->op;.      ass
13be0 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
13bf0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  t==0 );.      pE
13c00 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
13c10 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
13c20 70 4e 65 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pNew->pLeft);.  
13c30 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
13c40 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
13c50 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69        pExpr->pRi
13c60 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
13c70 72 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70  rDup(db, pNew->p
13c80 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 73  Right);.      as
13c90 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69  sert( pExpr->pLi
13ca0 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  st==0 );.      p
13cb0 45 78 70 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71  Expr->pList = sq
13cc0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
13cd0 28 64 62 2c 20 70 4e 65 77 2d 3e 70 4c 69 73 74  (db, pNew->pList
13ce0 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
13cf0 69 54 61 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69  iTable = pNew->i
13d00 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 45 78  Table;.      pEx
13d10 70 72 2d 3e 70 54 61 62 20 3d 20 70 4e 65 77 2d  pr->pTab = pNew-
13d20 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 70 45 78  >pTab;.      pEx
13d30 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e  pr->iColumn = pN
13d40 65 77 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ew->iColumn;.   
13d50 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
13d60 20 70 4e 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20   pNew->iAgg;.   
13d70 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43     sqlite3TokenC
13d80 6f 70 79 28 64 62 2c 20 26 70 45 78 70 72 2d 3e  opy(db, &pExpr->
13d90 74 6f 6b 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f  token, &pNew->to
13da0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ken);.      sqli
13db0 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c  te3TokenCopy(db,
13dc0 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26   &pExpr->span, &
13dd0 70 4e 65 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  pNew->span);.   
13de0 20 20 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63     pExpr->pSelec
13df0 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
13e00 74 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70  tDup(db, pNew->p
13e10 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 70  Select);.      p
13e20 45 78 70 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e  Expr->flags = pN
13e30 65 77 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ew->flags;.    }
13e40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75  .  }else{.    su
13e50 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70  bstExpr(db, pExp
13e60 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  r->pLeft, iTable
13e70 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
13e80 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78  ubstExpr(db, pEx
13e90 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  pr->pRight, iTab
13ea0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
13eb0 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
13ec0 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c   pExpr->pSelect,
13ed0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
13ee0 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
13ef0 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  ist(db, pExpr->p
13f00 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
13f10 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
13f20 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
13f30 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65  prList(.  sqlite
13f40 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f  3 *db,         /
13f50 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20  * Report malloc 
13f60 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20  errors here */. 
13f70 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
13f80 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f  ,     /* List to
13f90 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
13fa0 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
13fb0 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itutes */.  int 
13fc0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
13fd0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
13fe0 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20  substituted */. 
13ff0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
14000 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
14010 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
14020 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
14030 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
14040 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
14050 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
14060 2b 29 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  +){.    substExp
14070 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  r(db, pList->a[i
14080 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 2c  ].pExpr, iTable,
14090 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a   pEList);.  }.}.
140a0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
140b0 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c 69 74  tSelect(.  sqlit
140c0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
140d0 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
140e0 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
140f0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
14100 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
14110 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68   statement in wh
14120 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
14130 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  titutions */.  i
14140 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
14150 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
14160 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20  be replaced */. 
14170 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
14180 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  t     /* Substit
14190 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  ute values */.){
141a0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
141b0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
141c0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
141d0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
141e0 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 75  p ) return;.  su
141f0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
14200 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62 6c  p->pEList, iTabl
14210 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
14220 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
14230 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54 61  p->pGroupBy, iTa
14240 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
14250 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
14260 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  , p->pOrderBy, i
14270 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
14280 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20    substExpr(db, 
14290 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62  p->pHaving, iTab
142a0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
142b0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
142c0 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20  pWhere, iTable, 
142d0 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
142e0 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50  Select(db, p->pP
142f0 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  rior, iTable, pE
14300 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20  List);.  pSrc = 
14310 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
14320 53 72 63 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Src ){.    for(i
14330 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74  =pSrc->nSrc, pIt
14340 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b  em=pSrc->a; i>0;
14350 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
14360 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
14370 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65  t(db, pItem->pSe
14380 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
14390 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
143a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
143b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
143c0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
143d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
143e0 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69  MIT_VIEW) */..#i
143f0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
14400 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
14410 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
14420 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
14430 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14440 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
14450 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
14460 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 70 65   in order to spe
14470 65 64 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  ed.** execution.
14480 20 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69    It returns 1 i
14490 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67  f it makes chang
144a0 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66  es and 0 if no f
144b0 6c 61 74 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63  lattening.** occ
144c0 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
144d0 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
144e0 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
144f0 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
14500 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
14510 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
14520 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
14530 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
14540 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
14550 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
14560 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
14570 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
14580 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
14590 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
145a0 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
145b0 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
145c0 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
145d0 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
145e0 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
145f0 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
14600 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
14610 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
14620 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
14630 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
14640 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
14650 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
14660 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
14670 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
14680 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
14690 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
146a0 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
146b0 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
146c0 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
146d0 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
146e0 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
146f0 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
14700 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
14710 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
14720 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
14730 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
14740 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
14750 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
14760 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
14770 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
14780 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
14790 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
147a0 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
147b0 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
147c0 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
147d0 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
147e0 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
147f0 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
14800 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
14810 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
14820 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
14830 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
14840 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
14850 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
14860 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
14870 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
14880 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
14890 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
148a0 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
148b0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
148c0 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
148d0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
148e0 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
148f0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
14900 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
14910 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
14920 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
14930 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
14940 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
14950 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72  in.**        (Or
14960 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20  iginally ticket 
14970 23 33 30 36 2e 20 20 53 74 72 65 6e 67 68 74 65  #306.  Strenghte
14980 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ned by ticket #3
14990 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  300).**.**   (4)
149a0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
149b0 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 20 6f  s not DISTINCT o
149c0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
149d0 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
149e0 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 20 54 68  .**.**   (5)  Th
149f0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
14a00 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68  t DISTINCT or th
14a10 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
14a20 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
14a30 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
14a40 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68  .**.**   (6)  Th
14a50 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
14a60 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
14a70 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
14a80 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
14a90 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
14aa0 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
14ab0 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61  e subquery has a
14ac0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
14ad0 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73  .**   (8)  The s
14ae0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
14af0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
14b00 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
14b10 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
14b20 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75  **   (9)  The su
14b30 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
14b40 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
14b50 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
14b60 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
14b70 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
14b80 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65  **.**  (10)  The
14b90 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
14ba0 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
14bb0 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
14bc0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
14bd0 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49          use LIMI
14be0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  T..**.**  (11)  
14bf0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
14c00 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14c10 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76   do not both hav
14c20 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
14c30 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20  es..**.**  (12) 
14c40 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   Not implemented
14c50 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  .  Subsumed into
14c60 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
14c70 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c  .  Was previousl
14c80 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65  y.**        a se
14c90 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69  parate restricti
14ca0 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d  on deriving from
14cb0 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a   ticket #350..**
14cc0 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
14cd0 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
14ce0 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
14cf0 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 0a 2a 2a  oth use LIMIT.**
14d00 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73  .**  (14)  The s
14d10 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
14d20 20 75 73 65 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a   use OFFSET.**.*
14d30 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74  *  (15)  The out
14d40 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
14d50 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
14d60 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65  nd select or the
14d70 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
14d80 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ery does not hav
14d90 65 20 62 6f 74 68 20 61 6e 20 4f 52 44 45 52 20  e both an ORDER 
14da0 42 59 20 61 6e 64 20 61 20 4c 49 4d 49 54 20 63  BY and a LIMIT c
14db0 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  lause..**       
14dc0 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33   (See ticket #23
14dd0 33 39 29 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  39).**.**  (16) 
14de0 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
14df0 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
14e00 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71  gate or the subq
14e10 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20  uery does.**    
14e20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20      not contain 
14e30 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b  ORDER BY.  (Tick
14e40 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20  et #2942)  This 
14e50 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74  used to not matt
14e60 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74  er.**        unt
14e70 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64  il we introduced
14e80 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61   the group_conca
14e90 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a  t() function.  .
14ea0 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65  **.**  (17)  The
14eb0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
14ec0 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  t a compound sel
14ed0 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20  ect, or it is a 
14ee0 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20  UNION ALL .**   
14ef0 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c       compound cl
14f00 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74  ause made up ent
14f10 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67  irely of non-agg
14f20 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20  regate queries, 
14f30 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74  and .**        t
14f40 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a  he parent query:
14f50 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
14f60 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  * is not itself 
14f70 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
14f80 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20  nd select,.**   
14f90 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
14fa0 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
14fb0 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20  DISTINCT query, 
14fc0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
14fd0 2a 20 68 61 73 20 6e 6f 20 6f 74 68 65 72 20 74  * has no other t
14fe0 61 62 6c 65 73 20 6f 72 20 73 75 62 2d 73 65 6c  ables or sub-sel
14ff0 65 63 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ects in the FROM
15000 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
15010 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e 74        The parent
15020 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d   and sub-query m
15030 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45  ay contain WHERE
15040 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63   clauses. Subjec
15050 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72  t to.**        r
15060 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29 20  ules (11), (13) 
15070 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d  and (14), they m
15080 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ay also contain 
15090 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20  ORDER BY,.**    
150a0 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46      LIMIT and OF
150b0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  FSET clauses..**
150c0 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68  .**  (18)  If th
150d0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
150e0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
150f0 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73  , then all terms
15100 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   of the.**      
15110 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73    ORDER by claus
15120 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
15130 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72  must be simple r
15140 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a  eferences to .**
15150 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20          columns 
15160 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
15170 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54  ..**.**  (19)  T
15180 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
15190 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
151a0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
151b0 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
151c0 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52       have a WHER
151d0 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  E clause..**.** 
151e0 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  In this routine,
151f0 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   the "p" paramet
15200 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
15210 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
15220 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75  ry..** The subqu
15230 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e  ery is p->pSrc->
15240 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67  a[iFrom].  isAgg
15250 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
15260 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75  outer query.** u
15270 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61  ses aggregates a
15280 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nd subqueryIsAgg
15290 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
152a0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
152b0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
152c0 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
152d0 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
152e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
152f0 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75  a no-op and retu
15300 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61  rns 0..** If fla
15310 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d  ttening is attem
15320 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  pted this routin
15330 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a  e returns 1..**.
15340 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78  ** All of the ex
15350 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
15360 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20  s must occur on 
15370 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71  both the outer q
15380 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20  uery and.** the 
15390 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20  subquery before 
153a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
153b0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
153c0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
153d0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
153e0 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
153f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15400 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
15410 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
15420 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
15430 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
15440 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
15450 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
15460 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
15470 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
15480 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
15490 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20  isAgg,          
154a0 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
154b0 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
154c0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
154d0 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75  s */.  int subqu
154e0 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54  eryIsAgg    /* T
154f0 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
15500 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
15510 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
15520 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
15530 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
15540 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
15550 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c  thContext;.  Sel
15560 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20  ect *pParent;.  
15570 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
15580 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
15590 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
155a0 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
155b0 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
155c0 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
155d0 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
155e0 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
155f0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
15600 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
15610 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
15620 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
15630 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
15640 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
15650 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
15660 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78  subquery */.  Ex
15670 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
15680 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
15690 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72  set of the outer
156a0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
156b0 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
156c0 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
156d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75  umber of the pSu
156e0 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d  b result set tem
156f0 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  p table */.  int
15700 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
15710 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
15720 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
15730 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
15740 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
15750 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
15760 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
15770 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
15780 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
15790 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
157a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
157b0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
157c0 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
157d0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
157e0 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
157f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
15800 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  p!=0 );.  if( p=
15810 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
15820 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
15830 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61  or==0 );  /* Una
15840 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63  ble to flatten c
15850 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20  ompound queries 
15860 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  */.  pSrc = p->p
15870 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
15880 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20  Src && iFrom>=0 
15890 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e  && iFrom<pSrc->n
158a0 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65  Src );.  pSubite
158b0 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72  m = &pSrc->a[iFr
158c0 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d  om];.  iParent =
158d0 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73   pSubitem->iCurs
158e0 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75  or;.  pSub = pSu
158f0 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
15900 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d    assert( pSub!=
15910 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67  0 );.  if( isAgg
15920 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
15930 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  g ) return 0;   
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15950 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29   Restriction (1)
15960 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75    */.  if( subqu
15970 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72 63  eryIsAgg && pSrc
15980 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72  ->nSrc>1 ) retur
15990 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  n 0;          /*
159a0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29   Restriction (2)
159b0 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d    */.  pSubSrc =
159c0 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61   pSub->pSrc;.  a
159d0 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20 29  ssert( pSubSrc )
159e0 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20  ;.  /* Prior to 
159f0 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77  version 3.1.2, w
15a00 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
15a10 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20 73  FSET had to be s
15a20 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c  imple constants,
15a30 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72  .  ** not arbitr
15a40 61 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73  ary expresssions
15a50 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d  , we allowed som
15a60 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c  e combining of L
15a70 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
15a80 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65    ** because the
15a90 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75  y could be compu
15aa0 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ted at compile-t
15ab0 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c  ime.  But when L
15ac0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
15ad0 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69    ** became arbi
15ae0 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  trary expression
15af0 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63 65  s, we were force
15b00 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69 63  d to add restric
15b10 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20  tions (13).  ** 
15b20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69  and (14). */.  i
15b30 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
15b40 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72  && p->pLimit ) r
15b50 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
15b60 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
15b70 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69  tion (13) */.  i
15b80 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74  f( pSub->pOffset
15b90 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bb0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
15bc0 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69  tion (14) */.  i
15bd0 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  f( p->pRightmost
15be0 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74   && pSub->pLimit
15bf0 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
15c00 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
15c10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
15c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15c40 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
15c50 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  5) */.  }.  if( 
15c60 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  pSubSrc->nSrc==0
15c70 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
15ca0 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28 20  n (7)  */.  if( 
15cb0 28 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ((pSub->selFlags
15cc0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
15cd0 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69 6d  =0 || pSub->pLim
15ce0 69 74 29 20 0a 20 20 20 20 20 20 20 20 20 26 26  it) .         &&
15cf0 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
15d00 7c 20 69 73 41 67 67 29 20 29 7b 20 20 20 20 20  | isAgg) ){     
15d10 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
15d20 69 6f 6e 73 20 28 34 29 28 35 29 28 38 29 28 39  ions (4)(5)(8)(9
15d30 29 20 2a 2f 0a 20 20 20 20 20 72 65 74 75 72 6e  ) */.     return
15d40 20 30 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a 20   0;       .  }. 
15d50 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
15d60 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
15d70 21 3d 30 20 26 26 20 73 75 62 71 75 65 72 79 49  !=0 && subqueryI
15d80 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65 74  sAgg ){.     ret
15d90 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
15da0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 36  * Restriction (6
15db0 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  )  */.  }.  if( 
15dc0 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  p->pOrderBy && p
15dd0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
15de0 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
15e20 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f  triction (11) */
15e30 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67 67  .  }.  if( isAgg
15e40 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
15e50 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  By ) return 0;  
15e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15e70 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 36   Restriction (16
15e80 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
15e90 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 57  >pLimit && p->pW
15ea0 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15ec0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 39   Restriction (19
15ed0 29 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c  ) */..  /* OBSOL
15ee0 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20  ETE COMMENT 1:. 
15ef0 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
15f00 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
15f10 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
15f20 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
15f30 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
15f40 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
15f50 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
15f60 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
15f70 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
15f80 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
15f90 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
15fa0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
15fb0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
15fc0 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
15fd0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
15fe0 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
15ff0 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
16000 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
16010 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
16020 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
16030 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
16040 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
16050 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a  same thing..  **
16060 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  ** OBSOLETE C
16070 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52  OMMENT 2:.  ** R
16080 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
16090 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
160a0 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
160b0 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
160c0 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
160d0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
160e0 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
160f0 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
16100 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
16110 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
16120 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
16130 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
16140 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
16150 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
16160 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
16170 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
16180 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
16190 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
161a0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
161b0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
161c0 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
161d0 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
161e0 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
161f0 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
16200 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
16210 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
16220 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
16230 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
16240 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
16250 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a  INNER JOIN..  **
16260 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52  .  ** THIS OVERR
16270 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f  IDES OBSOLETE CO
16280 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41  MMENTS 1 AND 2 A
16290 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65  BOVE:.  ** Ticke
162a0 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68  t #3300 shows th
162b0 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  at flattening th
162c0 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
162d0 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a  a LEFT JOIN.  **
162e0 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68   is fraught with
162f0 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74   danger.  Best t
16300 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c  o avoid the whol
16310 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65  e thing.  If the
16320 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69  .  ** subquery i
16330 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  s the right term
16340 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
16350 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61   then do not fla
16360 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tten..  */.  if(
16370 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e   (pSubitem->join
16380 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
16390 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
163a0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  n 0;.  }..  /* R
163b0 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49  estriction 17: I
163c0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
163d0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
163e0 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75  LECT, then it mu
163f0 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79  st.  ** use only
16400 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   the UNION ALL o
16410 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e  perator. And non
16420 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20  e of the simple 
16430 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20  select queries. 
16440 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70   ** that make up
16450 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
16460 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64  LECT are allowed
16470 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65   to be aggregate
16480 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a   or distinct.  *
16490 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  * queries..  */.
164a0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69    if( pSub->pPri
164b0 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  or ){.    if( p-
164c0 3e 70 50 72 69 6f 72 20 7c 7c 20 69 73 41 67 67  >pPrior || isAgg
164d0 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   || (p->selFlags
164e0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
164f0 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63  =0 || pSrc->nSrc
16500 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
16510 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
16520 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b   for(pSub1=pSub;
16530 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53   pSub1; pSub1=pS
16540 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  ub1->pPrior){.  
16550 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e      if( (pSub1->
16560 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
16570 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
16580 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20  gate))!=0.      
16590 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69   || (pSub1->pPri
165a0 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21  or && pSub1->op!
165b0 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20  =TK_ALL) .      
165c0 20 7c 7c 20 21 70 53 75 62 31 2d 3e 70 53 72 63   || !pSub1->pSrc
165d0 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d   || pSub1->pSrc-
165e0 3e 6e 53 72 63 21 3d 31 0a 20 20 20 20 20 20 29  >nSrc!=1.      )
165f0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
16600 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
16610 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69  }..    /* Restri
16620 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20  ction 18. */.   
16630 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
16640 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
16650 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
16660 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79  ; ii<p->pOrderBy
16670 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
16680 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
16690 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 69  OrderBy->a[ii].i
166a0 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
166b0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
166c0 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49  .  }..  /***** I
166d0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
166e0 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e  point, flattenin
166f0 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
16700 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74  *****/..  /* Aut
16710 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75  horize the subqu
16720 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  ery */.  pParse-
16730 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
16740 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b  pSubitem->zName;
16750 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  .  sqlite3AuthCh
16760 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
16770 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
16780 20 30 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a   0);.  pParse->z
16790 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
167a0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
167b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
167c0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
167d0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
167e0 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
167f0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
16800 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
16810 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
16820 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
16830 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
16840 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
16850 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
16860 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
16870 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
16880 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
16890 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
168a0 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
168b0 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
168c0 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
168d0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
168e0 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
168f0 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
16900 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
16910 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
16920 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
16930 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
16940 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
16950 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
16960 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
16970 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
16980 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
16990 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
169a0 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
169b0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
169c0 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
169d0 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
169e0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
169f0 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
16a00 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
16a10 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
16a20 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
16a30 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
16a40 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
16a50 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
16a60 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
16a70 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
16a80 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
16a90 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
16aa0 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
16ab0 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
16ac0 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
16ad0 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
16ae0 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
16af0 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
16b00 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
16b10 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
16b20 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
16b30 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
16b40 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
16b50 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
16b60 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
16b70 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
16b80 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
16b90 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
16ba0 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
16bb0 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
16bc0 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
16bd0 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
16be0 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
16bf0 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
16c00 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
16c10 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
16c20 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
16c30 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
16c40 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
16c50 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
16c60 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
16c70 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
16c80 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
16c90 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
16ca0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
16cb0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
16cc0 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
16cd0 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
16ce0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
16cf0 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  it = 0;.    pNew
16d00 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
16d10 44 75 70 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  Dup(db, p);.    
16d20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
16d30 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  it;.    p->pOrde
16d40 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
16d50 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53      p->pSrc = pS
16d60 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20  rc;.    p->op = 
16d70 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70  TK_ALL;.    p->p
16d80 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20  Rightmost = 0;. 
16d90 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
16da0 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70  {.      pNew = p
16db0 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65  Prior;.    }else
16dc0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50  {.      pNew->pP
16dd0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
16de0 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
16df0 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d  tmost = 0;.    }
16e00 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
16e10 20 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 64   pNew;.    if( d
16e20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16e30 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
16e40 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74  .  /* Begin flat
16e50 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d  tening the iFrom
16e60 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  -th entry of the
16e70 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20   FROM clause .  
16e80 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ** in the outer 
16e90 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53  query..  */.  pS
16ea0 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75  ub = pSub1 = pSu
16eb0 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
16ec0 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
16ed0 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
16ee0 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63   structure assoc
16ef0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
16f00 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a   ** subquery.  *
16f10 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
16f20 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
16f30 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71  zDatabase);.  sq
16f40 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16f50 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pSubitem->zName)
16f60 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
16f70 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
16f80 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69  zAlias);.  pSubi
16f90 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
16fa0 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
16fb0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75  zName = 0;.  pSu
16fc0 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  bitem->zAlias = 
16fd0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  0;.  pSubitem->p
16fe0 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f  Select = 0;..  /
16ff0 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67  * Defer deleting
17000 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
17010 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
17020 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
17030 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  ery until code g
17040 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a  eneration is.  *
17050 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63  * complete, sinc
17060 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c  e there may stil
17070 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61  l exist Expr.pTa
17080 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20  b entries that. 
17090 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65   ** refer to the
170a0 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61   subquery even a
170b0 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e  fter flattening.
170c0 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a    Ticket #3346..
170d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 69    */.  if( pSubi
170e0 74 65 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a  tem->pTab!=0 ){.
170f0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54      Table *pTabT
17100 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d  oDel = pSubitem-
17110 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
17120 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d  TabToDel->nRef==
17130 31 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 54  1 ){.      pTabT
17140 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69  oDel->pNextZombi
17150 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 5a 6f 6d  e = pParse->pZom
17160 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 50  bieTab;.      pP
17170 61 72 73 65 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  arse->pZombieTab
17180 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20   = pTabToDel;.  
17190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
171a0 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d  TabToDel->nRef--
171b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
171c0 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
171d0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
171e0 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
171f0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
17200 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
17210 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
17220 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
17230 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
17240 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
17250 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
17260 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
17270 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
17280 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
17290 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
172a0 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
172b0 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
172c0 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
172d0 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
172e0 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
172f0 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
17300 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
17310 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
17320 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
17330 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
17340 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
17350 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
17360 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
17370 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
17380 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
17390 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
173a0 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
173b0 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
173c0 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
173d0 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
173e0 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
173f0 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
17400 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
17410 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
17420 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
17430 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
17440 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
17450 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
17460 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
17470 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
17480 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
17490 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
174a0 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
174b0 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
174c0 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
174d0 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
174e0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
174f0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
17500 72 63 3b 0a 20 20 20 20 69 6e 74 20 6a 6f 69 6e  rc;.    int join
17510 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53  type = 0;.    pS
17520 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
17530 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
17540 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65  clause of subque
17550 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72  ry */.    nSubSr
17560 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  c = pSubSrc->nSr
17570 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  c;  /* Number of
17580 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65   terms in subque
17590 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  ry FROM clause *
175a0 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61  /.    pSrc = pPa
175b0 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20  rent->pSrc;     
175c0 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
175d0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
175e0 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53  y */..    if( pS
175f0 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  rc ){.      asse
17600 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29  rt( pParent==p )
17610 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65  ;  /* First time
17620 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
17630 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74  p */.      joint
17640 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ype = pSubitem->
17650 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65  jointype;.    }e
17660 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
17670 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b  t( pParent!=p );
17680 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62    /* 2nd and sub
17690 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68  sequent times th
176a0 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
176b0 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  /.      pSrc = p
176c0 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73  Parent->pSrc = s
176d0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
176e0 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29  end(db, 0, 0, 0)
176f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  ;.      if( pSrc
17700 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
17710 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
17720 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
17730 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
17740 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
17750 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  The subquery use
17760 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20  s a single slot 
17770 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
17780 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a  se of the outer.
17790 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49      ** query.  I
177a0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  f the subquery h
177b0 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
177c0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20   element in its 
177d0 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20  FROM clause,.   
177e0 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20   ** then expand 
177f0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17800 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f  to make space fo
17810 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  r it to hold all
17820 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a   elements.    **
17830 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
17840 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
17850 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
17860 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54      **    SELECT
17870 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53   * FROM tabA, (S
17880 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62  ELECT * FROM sub
17890 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a  1, sub2), tabB;.
178a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
178b0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61  e outer query ha
178c0 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73  s 3 slots in its
178d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f   FROM clause.  O
178e0 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20  ne slot of the. 
178f0 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
17900 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c  y (the middle sl
17910 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74  ot) is used by t
17920 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68  he subquery.  Th
17930 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c  e next.    ** bl
17940 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c  ock of code will
17950 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20   expand the out 
17960 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73  query to 4 slots
17970 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20  .  The middle.  
17980 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70    ** slot is exp
17990 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f  anded to two slo
179a0 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ts in order to m
179b0 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ake space for th
179c0 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65  e.    ** two ele
179d0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f  ments in the FRO
179e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
179f0 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  subquery..    */
17a00 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63  .    if( nSubSrc
17a10 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  >1 ){.      pPar
17a20 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  ent->pSrc = pSrc
17a30 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
17a40 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72  tEnlarge(db, pSr
17a50 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72  c, nSubSrc-1,iFr
17a60 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  om+1);.      if(
17a70 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
17a80 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  d ){.        bre
17a90 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
17aa0 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66  }..    /* Transf
17ab0 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  er the FROM clau
17ac0 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68  se terms from th
17ad0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
17ae0 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
17af0 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20   query..    */. 
17b00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
17b10 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubSrc; i++){.   
17b20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72     pSrc->a[i+iFr
17b30 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  om] = pSubSrc->a
17b40 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  [i];.      memse
17b50 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
17b60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
17b70 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
17b80 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
17b90 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  From].jointype =
17ba0 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20   jointype;.  .  
17bb0 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
17bc0 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
17bd0 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
17be0 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
17bf0 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
17c00 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
17c10 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
17c20 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  uery..    ** .  
17c30 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
17c40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
17c50 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
17c60 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
17c70 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
17c80 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
17c90 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20  >b;.    **   \  
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cb0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
17cc0 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
17cd0 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
17ce0 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f  /.    **    \___
17cf0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
17d00 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
17d10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
17d20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
17d30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20     **.    ** We 
17d40 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
17d50 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
17d60 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
17d70 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
17d80 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65  ee.    ** "a" we
17d90 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
17da0 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
17db0 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
17dc0 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
17dd0 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  "..    */.    pL
17de0 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ist = pParent->p
17df0 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69  EList;.    for(i
17e00 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
17e10 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
17e20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20  Expr *pExpr;.   
17e30 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b     if( pList->a[
17e40 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28  i].zName==0 && (
17e50 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
17e60 5b 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e  [i].pExpr)->span
17e70 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  .z!=0 ){.       
17e80 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
17e90 6d 65 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  me = .          
17ea0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74       sqlite3DbSt
17eb0 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
17ec0 29 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20  )pExpr->span.z, 
17ed0 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  pExpr->span.n);.
17ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17ef0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
17f00 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c  db, pParent->pEL
17f10 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  ist, iParent, pS
17f20 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
17f30 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20   if( isAgg ){.  
17f40 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
17f50 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
17f60 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74  GroupBy, iParent
17f70 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
17f80 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
17f90 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48  (db, pParent->pH
17fa0 61 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20  aving, iParent, 
17fb0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
17fc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
17fd0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
17fe0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
17ff0 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rent->pOrderBy==
18000 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
18010 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  nt->pOrderBy = p
18020 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Sub->pOrderBy;. 
18030 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65       pSub->pOrde
18040 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rBy = 0;.    }el
18050 73 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  se if( pParent->
18060 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
18070 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
18080 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  db, pParent->pOr
18090 64 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20  derBy, iParent, 
180a0 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
180b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75     }.    if( pSu
180c0 62 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  b->pWhere ){.   
180d0 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
180e0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
180f0 53 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  Sub->pWhere);.  
18100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
18110 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d  Where = 0;.    }
18120 0a 20 20 20 20 69 66 28 20 73 75 62 71 75 65 72  .    if( subquer
18130 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20  yIsAgg ){.      
18140 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
18150 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
18160 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
18170 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d  aving = pParent-
18180 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70  >pWhere;.      p
18190 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
181a0 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 73   pWhere;.      s
181b0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
181c0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
181d0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
181e0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61  List);.      pPa
181f0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
18200 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
18210 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  b, pParent->pHav
18220 69 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ing, .          
18230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18240 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18250 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
18260 3e 70 48 61 76 69 6e 67 29 29 3b 0a 20 20 20 20  >pHaving));.    
18270 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
18280 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  t->pGroupBy==0 )
18290 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
182a0 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
182b0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
182c0 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42  b, pSub->pGroupB
182d0 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  y);.    }else{. 
182e0 20 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64       substExpr(d
182f0 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  b, pParent->pWhe
18300 72 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  re, iParent, pSu
18310 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
18320 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72    pParent->pWher
18330 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
18340 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e  nd(db, pParent->
18350 70 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b  pWhere, pWhere);
18360 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
18370 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71   The flattened q
18380 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
18390 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69   if either the i
183a0 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20  nner or the.    
183b0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  ** outer query i
183c0 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20  s distinct. .   
183d0 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d   */.    pParent-
183e0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75  >selFlags |= pSu
183f0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
18400 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20  _Distinct;.  .  
18410 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45    /*.    ** SELE
18420 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c  CT ... FROM (SEL
18430 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20  ECT ... LIMIT a 
18440 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20  OFFSET b) LIMIT 
18450 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20  x OFFSET y;.    
18460 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73  **.    ** One is
18470 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20   tempted to try 
18480 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74  to add a and b t
18490 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69  o combine the li
184a0 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a  mits.  But this.
184b0 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20      ** does not 
184c0 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c  work if either l
184d0 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
184e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
184f0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b   pSub->pLimit ){
18500 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
18510 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70  pLimit = pSub->p
18520 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75  Limit;.      pSu
18530 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  b->pLimit = 0;. 
18540 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
18550 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20  inially, delete 
18560 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20  what is left of 
18570 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  the subquery and
18580 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63   return.  ** suc
18590 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  cess..  */.  sql
185a0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
185b0 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20  (db, pSub1);..  
185c0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
185d0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
185e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
185f0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
18600 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
18610 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  W) */../*.** Ana
18620 6c 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20  lyze the SELECT 
18630 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
18640 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
18650 74 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20  to see if it.** 
18660 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61  is a min() or ma
18670 78 28 29 20 71 75 65 72 79 2e 20 52 65 74 75 72  x() query. Retur
18680 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
18690 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44  MIN or WHERE_ORD
186a0 45 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20  ERBY_MAX if .** 
186b0 69 74 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65  it is, or 0 othe
186c0 72 77 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e  rwise. At presen
186d0 74 2c 20 61 20 71 75 65 72 79 20 69 73 20 63 6f  t, a query is co
186e0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a  nsidered to be.*
186f0 2a 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20  * a min()/max() 
18700 71 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  query if:.**.** 
18710 20 20 31 2e 20 54 68 65 72 65 20 69 73 20 61 20    1. There is a 
18720 73 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e  single object in
18730 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18740 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65  ..**.**   2. The
18750 72 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65  re is a single e
18760 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
18770 20 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64   result set, and
18780 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65   it is.**      e
18790 69 74 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20  ither min(x) or 
187a0 6d 61 78 28 78 29 2c 20 77 68 65 72 65 20 78 20  max(x), where x 
187b0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65  is a column refe
187c0 72 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rence..*/.static
187d0 20 69 6e 74 20 6d 69 6e 4d 61 78 51 75 65 72 79   int minMaxQuery
187e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
187f0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78  Select *p){.  Ex
18800 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70  pr *pExpr;.  Exp
18810 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
18820 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66  p->pEList;..  if
18830 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ( pEList->nExpr!
18840 3d 31 20 29 20 72 65 74 75 72 6e 20 57 48 45 52  =1 ) return WHER
18850 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
18860 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69  ;.  pExpr = pELi
18870 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
18880 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
18890 2d 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  ->pList;.  if( p
188a0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
188b0 5f 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 70 45 4c  _FUNCTION || pEL
188c0 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74  ist==0 || pEList
188d0 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
188e0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 4c  urn 0;.  if( pEL
188f0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
18900 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
18910 4d 4e 20 29 20 72 65 74 75 72 6e 20 57 48 45 52  MN ) return WHER
18920 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
18930 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74  ;.  if( pExpr->t
18940 6f 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75  oken.n!=3 ) retu
18950 72 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  rn WHERE_ORDERBY
18960 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28 20 73  _NORMAL;.  if( s
18970 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28  qlite3StrNICmp((
18980 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
18990 65 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30  en.z,"min",3)==0
189a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
189b0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
189c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
189d0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
189e0 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
189f0 6e 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20  n.z,"max",3)==0 
18a00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48  ){.    return WH
18a10 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b  ERE_ORDERBY_MAX;
18a20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 48  .  }.  return WH
18a30 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
18a40 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  AL;.}../*.** If 
18a50 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
18a60 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61  item passed as a
18a70 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61  n argument was a
18a80 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e  ugmented with an
18a90 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63  .** INDEXED BY c
18aa0 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20  lause, then try 
18ab0 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70  to locate the sp
18ac0 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49  ecified index. I
18ad0 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73  f there.** was s
18ae0 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64  uch a clause and
18af0 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
18b00 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
18b10 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
18b20 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65  ITE_ERROR and le
18b30 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
18b40 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73  pParse. Otherwis
18b50 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20  e, populate .** 
18b60 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e  pFrom->pIndex an
18b70 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
18b80 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
18b90 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
18ba0 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
18bb0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
18bc0 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
18bd0 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
18be0 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78  && pFrom->zIndex
18bf0 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
18c00 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
18c10 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  b;.    char *zIn
18c20 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e  dex = pFrom->zIn
18c30 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dex;.    Index *
18c40 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
18c50 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
18c60 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26   .        pIdx &
18c70 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
18c80 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49  (pIdx->zName, zI
18c90 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20  ndex); .        
18ca0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
18cb0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
18cc0 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  !pIdx ){.      s
18cd0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
18ce0 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
18cf0 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64  index: %s", zInd
18d00 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  ex, 0);.      re
18d10 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
18d20 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72  R;.    }.    pFr
18d30 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64  om->pIndex = pId
18d40 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
18d50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
18d60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18d70 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c   is a Walker cal
18d80 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e  lback for "expan
18d90 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73  ding" a SELECT s
18da0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78  tatement..** "Ex
18db0 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74  panding" means t
18dc0 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  o do the followi
18dd0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ng:.**.**    (1)
18de0 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45    Make sure VDBE
18df0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
18e00 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e  have been assign
18e10 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20  ed to every.**  
18e20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f         element o
18e30 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
18e40 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
18e50 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61   Fill in the pTa
18e60 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20  bList->a[].pTab 
18e70 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72  fields in the Sr
18e80 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20  cList that .**  
18e90 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46         defines F
18ea0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65  ROM clause.  Whe
18eb0 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69  n views appear i
18ec0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
18ed0 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69  e,.**         fi
18ee0 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d  ll pTabList->a[]
18ef0 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20  .pSelect with a 
18f00 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
18f10 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
18f20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70          that imp
18f30 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
18f40 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  .  A copy is mad
18f50 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20  e of the view's 
18f60 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
18f70 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74    statement so t
18f80 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c  hat we can freel
18f90 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65  y modify or dele
18fa0 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
18fb0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74  t.**         wit
18fc0 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62  hout worrying ab
18fd0 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74  out messing up t
18fe0 68 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65  he presistent re
18ff0 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  presentation.** 
19000 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76          of the v
19010 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33  iew..**.**    (3
19020 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20  )  Add terms to 
19030 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
19040 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74   to accomodate t
19050 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
19060 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
19070 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
19080 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
19090 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
190a0 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
190b0 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
190c0 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
190d0 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
190e0 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
190f0 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
19100 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
19110 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
19120 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
19130 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
19140 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
19150 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
19160 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
19170 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
19180 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
19190 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
191a0 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74   TABLE..**.*/.st
191b0 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45  atic int selectE
191c0 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a  xpander(Walker *
191d0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
191e0 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
191f0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
19200 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c  pParse;.  int i,
19210 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74   j, k;.  SrcList
19220 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
19230 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
19240 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
19250 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
19260 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
19270 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
19280 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19290 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d  ){.    return
192a0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
192b0 20 20 69 66 28 20 70 2d 3e 70 53 72 63 3d 3d 30    if( p->pSrc==0
192c0 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   || (p->selFlags
192d0 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21   & SF_Expanded)!
192e0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
192f0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a   WRC_Prune;.  }.
19300 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
19310 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
19320 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
19330 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70  rc;.  pEList = p
19340 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20  ->pEList;..  /* 
19350 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
19360 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
19370 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
19380 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
19390 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
193a0 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
193b0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
193c0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
193d0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
193e0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
193f0 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
19400 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
19410 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
19420 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
19430 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
19440 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
19450 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
19460 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
19470 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
19480 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
19490 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
194a0 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
194b0 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
194c0 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
194d0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
194e0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
194f0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
19500 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
19510 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
19520 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
19530 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ab!=0 ){.      /
19540 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
19550 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
19560 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65  n prepared.  The
19570 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
19580 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72      ** to go fur
19590 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ther. */.      a
195a0 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20  ssert( i==0 );. 
195b0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
195c0 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
195d0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d   if( pFrom->zNam
195e0 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  e==0 ){.#ifndef 
195f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19600 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63  UERY.      Selec
19610 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
19620 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
19630 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
19640 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
19650 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
19660 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19670 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sel!=0 );.      
19680 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
19690 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
196a0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
196b0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
196c0 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
196d0 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
196e0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
196f0 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
19700 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e));.      if( p
19710 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
19720 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
19730 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a   pTab->db = db;.
19740 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
19750 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62   = 1;.      pTab
19760 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
19770 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71  3MPrintf(db, "sq
19780 6c 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70  lite_subquery_%p
19790 5f 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29  _", (void*)pTab)
197a0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
197b0 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70  Sel->pPrior ){ p
197c0 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
197d0 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65  or; }.      sele
197e0 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
197f0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
19800 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  el->pEList, &pTa
19810 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
19820 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61  aCol);.      pTa
19830 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
19840 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
19850 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
19860 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ral;.#endif.    
19870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
19880 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
19890 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
198a0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
198b0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
198c0 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
198d0 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
198e0 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
198f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19900 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
19910 73 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d  se,0,pFrom->zNam
19920 65 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61  e,pFrom->zDataba
19930 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  se);.      if( p
19940 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
19950 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
19960 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23   pTab->nRef++;.#
19970 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
19980 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
19990 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
199a0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
199b0 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70  BLE).      if( p
199c0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20  Tab->pSelect || 
199d0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
199e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
199f0 20 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74   reach here if t
19a00 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69  he named table i
19a10 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65  s a really a vie
19a20 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  w */.        if(
19a30 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
19a40 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
19a50 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
19a60 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a 20 20  n WRC_Abort;..  
19a70 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 6f        /* If pFro
19a80 6d 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69 74  m->pSelect!=0 it
19a90 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
19aa0 61 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20  aling with a.   
19ab0 20 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74       ** view wit
19ac0 68 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65  hin a view.  The
19ad0 20 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72   SELECT structur
19ae0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
19af0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  en.        ** co
19b00 70 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65  pied by the oute
19b10 72 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e  r view so we can
19b20 20 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73   skip the copy s
19b30 74 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20  tep here.       
19b40 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72   ** in the inner
19b50 20 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a   view..        *
19b60 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  /.        if( pF
19b70 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
19b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  ){.          pFr
19b90 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
19ba0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
19bb0 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  b, pTab->pSelect
19bc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
19bd0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
19be0 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70  Walker, pFrom->p
19bf0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
19c00 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
19c10 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
19c20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  Locate the index
19c30 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e   named by the IN
19c40 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
19c50 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20   if any. */.    
19c60 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78  if( sqlite3Index
19c70 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73  edByLookup(pPars
19c80 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
19c90 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
19ca0 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ort;.    }.  }..
19cb0 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54    /* Process NAT
19cc0 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61  URAL keywords, a
19cd0 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  nd ON and USING 
19ce0 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73  clauses of joins
19cf0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
19d00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
19d10 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
19d20 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b  in(pParse, p) ){
19d30 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
19d40 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Abort;.  }..  /*
19d50 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74   For every "*" t
19d60 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68  hat occurs in th
19d70 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69  e column list, i
19d80 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20  nsert the names 
19d90 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75  of.  ** all colu
19da0 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65  mns in all table
19db0 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72  s.  And for ever
19dc0 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74  y TABLE.* insert
19dd0 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
19de0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
19df0 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61  n TABLE.  The pa
19e00 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20  rser inserted a 
19e10 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
19e20 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65  on.  ** with the
19e30 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72   TK_ALL operator
19e40 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68   for each "*" th
19e50 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74  at it found in t
19e60 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  he column list..
19e70 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
19e80 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
19e90 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
19ea0 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  K_ALL expression
19eb0 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a  s and expand.  *
19ec0 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  * each one to th
19ed0 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
19ee0 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
19ef0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
19f00 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75  he first loop ju
19f10 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  st checks to see
19f20 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
19f30 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a  y "*" operators.
19f40 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65    ** that need e
19f50 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  xpanding..  */. 
19f60 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
19f70 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
19f80 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
19f90 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
19fa0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
19fb0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
19fc0 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  ak;.    if( pE->
19fd0 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
19fe0 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e  ->pRight && pE->
19ff0 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41  pRight->op==TK_A
1a000 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  LL.         && p
1a010 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e  E->pLeft && pE->
1a020 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pLeft->op==TK_ID
1a030 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1a040 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
1a050 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
1a060 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
1a070 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
1a080 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
1a090 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
1a0a0 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
1a0b0 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
1a0c0 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
1a0d0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
1a0e0 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
1a0f0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
1a100 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
1a110 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
1a120 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
1a130 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1a140 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
1a150 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
1a160 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
1a170 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
1a180 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
1a190 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
1a1a0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1a1b0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
1a1c0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
1a1d0 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61           && (fla
1a1e0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
1a1f0 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
1a200 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
1a210 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
1a220 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
1a230 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
1a240 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
1a250 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20  p!=TK_ALL &&.   
1a260 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21          (pE->op!
1a270 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
1a280 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  Right==0 || pE->
1a290 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41  pRight->op!=TK_A
1a2a0 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  LL) ){.        /
1a2b0 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
1a2c0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  r expression doe
1a2d0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1a2e0 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20   expanded..     
1a2f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e     */.        pN
1a300 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1a310 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1a320 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45  e, pNew, a[k].pE
1a330 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
1a340 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
1a350 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
1a360 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
1a370 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
1a380 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a390 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
1a3a0 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d   0;.        a[k]
1a3b0 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  .zName = 0;.    
1a3c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a3d0 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
1a3e0 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
1a3f0 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
1a400 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
1a410 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
1a420 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
1a430 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
1a440 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
1a450 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
1a460 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
1a470 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20  ar *zTName;     
1a480 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
1a490 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
1a4a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1a4b0 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
1a4c0 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20   pE->pLeft ){.  
1a4d0 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d          zTName =
1a4e0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1a4f0 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 70  Token(db, &pE->p
1a500 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20  Left->token);.  
1a510 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a520 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
1a530 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1a540 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
1a550 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
1a560 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1a570 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
1a580 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
1a590 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
1a5a0 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
1a5b0 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
1a5c0 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
1a5d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
1a5e0 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54  TabName==0 || zT
1a5f0 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20  abName[0]==0 ){ 
1a600 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
1a610 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
1a620 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
1a630 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
1a640 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a650 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
1a660 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
1a670 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1a680 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  zTName, zTabName
1a690 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1a6a0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1a6b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a6c0 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20      tableSeen = 
1a6d0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  1;.          for
1a6e0 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
1a6f0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1a700 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70        Expr *pExp
1a710 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20  r, *pRight;.    
1a720 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
1a730 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
1a740 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20  [j].zName;..    
1a750 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
1a760 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64  column is marked
1a770 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75   as 'hidden' (cu
1a780 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73  rrently only pos
1a790 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  sible.          
1a7a0 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c    ** for virtual
1a7b0 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74   tables), do not
1a7c0 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74   include it in t
1a7d0 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20  he expanded.    
1a7e0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c          ** resul
1a7f0 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20  t-set list..    
1a800 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1a810 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64         if( IsHid
1a820 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d  denColumn(&pTab-
1a830 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20  >aCol[j]) ){.   
1a840 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1a850 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  t(IsVirtual(pTab
1a860 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
1a870 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1a880 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1a890 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
1a8a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1a8b0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1a8c0 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54  tem *pLeft = &pT
1a8d0 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a  abList->a[i-1];.
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1a8f0 28 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e  ( (pLeft[1].join
1a900 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
1a910 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20  L)!=0 &&.       
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a930 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
1a940 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29  ft->pTab, zName)
1a950 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
1a960 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e         /* In a N
1a970 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69  ATURAL join, omi
1a980 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d  t the join colum
1a990 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ns from the .   
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1a9b0 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
1a9c0 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ht */.          
1a9d0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1aa00 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  ( sqlite3IdListI
1aa10 6e 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55  ndex(pLeft[1].pU
1aa20 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  sing, zName)>=0 
1aa30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1aa40 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20     /* In a join 
1aa50 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61  with a USING cla
1aa60 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e  use, omit column
1aa70 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
1aa80 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e           ** usin
1aa90 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68  g clause from th
1aaa0 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  e table on the r
1aab0 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ight. */.       
1aac0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1aad0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1aae0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
1aaf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69  .            pRi
1ab00 67 68 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  ght = sqlite3PEx
1ab10 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44  pr(pParse, TK_ID
1ab20 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1ab30 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67          if( pRig
1ab40 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ht==0 ) break;. 
1ab50 20 20 20 20 20 20 20 20 20 20 20 73 65 74 51 75             setQu
1ab60 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61 72 73 65  otedToken(pParse
1ab70 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  , &pRight->token
1ab80 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
1ab90 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
1aba0 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
1abb0 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  >nSrc>1 ){.     
1abc0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
1abd0 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 50 45  Left = sqlite3PE
1abe0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
1abf0 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  D, 0, 0, 0);.   
1ac00 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1ac10 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1ac20 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
1ac30 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
1ac40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1ac50 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
1ac60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1ac70 20 20 20 20 20 73 65 74 51 75 6f 74 65 64 54 6f       setQuotedTo
1ac80 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70 4c 65  ken(pParse, &pLe
1ac90 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e  ft->token, zTabN
1aca0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1acb0 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45      setToken(&pE
1acc0 78 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20 20 20  xpr->span, .    
1acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1ace0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1acf0 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61   "%s.%s", zTabNa
1ad00 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  me, zName));.   
1ad10 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1ad20 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a  ->span.dyn = 1;.
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1ad40 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30  xpr->token.z = 0
1ad50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ad60 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d  pExpr->token.n =
1ad70 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1ad80 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64    pExpr->token.d
1ad90 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  yn = 0;.        
1ada0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1adb0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
1adc0 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
1add0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70         pExpr->sp
1ade0 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  an = pExpr->toke
1adf0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
1ae00 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e   pExpr->span.dyn
1ae10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1ae20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1ae30 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b  if( longNames ){
1ae40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1ae50 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
1ae60 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1ae70 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c  se, pNew, pExpr,
1ae80 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a   &pExpr->span);.
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1aea0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1aeb0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
1aec0 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
1aed0 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70  arse, pNew, pExp
1aee0 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65  r, &pRight->toke
1aef0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
1af00 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
1af10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1af20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29  if( !tableSeen )
1af30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1af40 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  zTName ){.      
1af50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1af60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1af70 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73  o such table: %s
1af80 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  ", zTName);.    
1af90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1afa0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1afb0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1afc0 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63   "no tables spec
1afd0 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20  ified");.       
1afe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1aff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
1b000 46 72 65 65 28 64 62 2c 20 7a 54 4e 61 6d 65 29  Free(db, zTName)
1b010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b020 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
1b030 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45  istDelete(db, pE
1b040 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
1b050 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
1b060 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1b070 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
1b080 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c  pEList && p->pEL
1b090 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  ist->nExpr>db->a
1b0a0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
1b0b0 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
1b0c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1b0d0 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
1b0e0 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72  any columns in r
1b0f0 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d  esult set");.  }
1b100 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1b110 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
1b120 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
1b130 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
1b140 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e  rse-tree walker.
1b150 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1b160 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
1b170 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
1b180 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73  back then expres
1b190 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72  sion trees.** ar
1b1a0 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74  e walked without
1b1b0 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69   any actions bei
1b1c0 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68  ng taken at each
1b1d0 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62   node.  Presumab
1b1e0 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  ly,.** when this
1b1f0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1b200 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70   for Walker.xExp
1b210 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a  rCallback then .
1b220 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63  ** Walker.xSelec
1b230 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74  tCallback is set
1b240 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
1b250 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72   useful for ever
1b260 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69  y .** subquery i
1b270 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65  n the parser tre
1b280 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1b290 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61   exprWalkNoop(Wa
1b2a0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
1b2b0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 72  xpr *pExpr){.  r
1b2c0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1b2d0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ue;.}../*.** Thi
1b2e0 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e  s routine "expan
1b2f0 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ds" a SELECT sta
1b300 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f  tement and all o
1b310 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73  f its subqueries
1b320 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f  ..** For additio
1b330 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
1b340 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73  on what it means
1b350 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53   to "expand" a S
1b360 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
1b370 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d  nt, see the comm
1b380 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63  ent on the selec
1b390 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63  tExpand worker c
1b3a0 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a  allback above..*
1b3b0 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61  *.** Expanding a
1b3c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1b3d0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  t is the first s
1b3e0 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  tep in processin
1b3f0 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  g a.** SELECT st
1b400 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45  atement.  The SE
1b410 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
1b420 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
1b430 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72  before.** name r
1b440 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72  esolution is per
1b450 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  formed..**.** If
1b460 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
1b470 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d  rong, an error m
1b480 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
1b490 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a  n into pParse..*
1b4a0 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
1b4b0 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63  nction can detec
1b4c0 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79  t the problem by
1b4d0 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72   looking at pPar
1b4e0 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f  se->nErr.** and/
1b4f0 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  or pParse->db->m
1b500 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a  allocFailed..*/.
1b510 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
1b520 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
1b530 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1b540 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
1b550 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77  .  Walker w;.  w
1b560 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
1b570 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65   = selectExpande
1b580 72 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  r;.  w.xExprCall
1b590 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e  back = exprWalkN
1b5a0 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
1b5b0 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
1b5c0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
1b5d0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
1b5e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b5f0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
1b600 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
1b610 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
1b620 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
1b630 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
1b640 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
1b650 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
1b660 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
1b670 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
1b680 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
1b690 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
1b6a0 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
1b6b0 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
1b6c0 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
1b6d0 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
1b6e0 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
1b6f0 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
1b700 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
1b710 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
1b720 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
1b730 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
1b740 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
1b750 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
1b760 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
1b770 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
1b780 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
1b790 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
1b7a0 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
1b7b0 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
1b7c0 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
1b7d0 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
1b7e0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
1b7f0 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
1b800 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
1b810 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64 53 75   int selectAddSu
1b820 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57  bqueryTypeInfo(W
1b830 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
1b840 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
1b850 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69  rse *pParse;.  i
1b860 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20  nt i;.  SrcList 
1b870 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72  *pTabList;.  str
1b880 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1b890 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65   *pFrom;..  asse
1b8a0 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
1b8b0 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b  & SF_Resolved );
1b8c0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1b8d0 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
1b8e0 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Info)==0 ){.    
1b8f0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
1b900 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20  F_HasTypeInfo;. 
1b910 20 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c     pParse = pWal
1b920 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  ker->pParse;.   
1b930 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
1b940 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Src;.    for(i=0
1b950 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
1b960 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
1b970 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
1b980 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c  m++){.      Tabl
1b990 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
1b9a0 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  >pTab;.      if(
1b9b0 20 70 54 61 62 20 26 26 20 28 70 54 61 62 2d 3e   pTab && (pTab->
1b9c0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
1b9d0 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20  hemeral)!=0 ){. 
1b9e0 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d         /* A sub-
1b9f0 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
1ba00 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
1ba10 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20  LECT */.        
1ba20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
1ba30 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
1ba40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1ba50 53 65 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 77  Sel );.        w
1ba60 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
1ba70 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c  or ) pSel = pSel
1ba80 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
1ba90 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d    selectAddColum
1baa0 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
1bab0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  n(pParse, pTab->
1bac0 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  nCol, pTab->aCol
1bad0 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d  , pSel);.      }
1bae0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1baf0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1bb00 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
1bb10 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1bb20 61 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e  adds datatype an
1bb30 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
1bb40 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ence information
1bb50 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65   to.** the Table
1bb60 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61   structures of a
1bb70 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
1bb80 75 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a  ubqueries in a.*
1bb90 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1bba0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nt..**.** Use th
1bbb0 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72  is routine after
1bbc0 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
1bbd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1bbe0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
1bbf0 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20  dTypeInfo(Parse 
1bc00 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
1bc10 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64  *pSelect){.#ifnd
1bc20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1bc30 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72  UBQUERY.  Walker
1bc40 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43   w;.  w.xSelectC
1bc50 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
1bc60 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
1bc70 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  nfo;.  w.xExprCa
1bc80 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
1bc90 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
1bca0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
1bcb0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1bcc0 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65  &w, pSelect);.#e
1bcd0 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.}.../*.** T
1bce0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
1bcf0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
1bd00 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
1bd10 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66  ssing.  The.** f
1bd20 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f  ollowing is acco
1bd30 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20  mplished:.**.** 
1bd40 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73      *  VDBE Curs
1bd50 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  or numbers are a
1bd60 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46  ssigned to all F
1bd70 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM-clause terms
1bd80 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65  ..**     *  Ephe
1bd90 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
1bda0 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20  cts are created 
1bdb0 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  for all FROM-cla
1bdc0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a  use subqueries..
1bdd0 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64  **     *  ON and
1bde0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
1bdf0 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20  re shifted into 
1be00 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73  WHERE statements
1be10 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63  .**     *  Wildc
1be20 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41  ards "*" and "TA
1be30 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74  BLE.*" in result
1be40 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64   sets are expand
1be50 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64  ed..**     *  Id
1be60 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70  entifiers in exp
1be70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63  ression are matc
1be80 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a  hed to tables..*
1be90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1bea0 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65  e acts recursive
1beb0 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65  ly on all subque
1bec0 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ries within the 
1bed0 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
1bee0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
1bef0 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
1bf00 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
1bf10 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
1bf20 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
1bf30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1bf40 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
1bf50 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
1bf60 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
1bf70 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
1bf80 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
1bf90 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a  or container */.
1bfa0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1bfb0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1bfc0 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50  eturn;.  db = pP
1bfd0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
1bfe0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1bff0 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72  _HasTypeInfo ) r
1c000 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
1c010 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1c020 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1c030 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1c040 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50  3SelectExpand(pP
1c050 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20  arse, p);.  if( 
1c060 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1c070 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c080 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1c090 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
1c0a0 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  tNames(pParse, p
1c0b0 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69  , pOuterNC);.  i
1c0c0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1c0d0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1c0e0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
1c0f0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
1c100 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c  TypeInfo(pParse,
1c110 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
1c120 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
1c130 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
1c140 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
1c150 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
1c160 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
1c170 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
1c180 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
1c190 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
1c1a0 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
1c1b0 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
1c1c0 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c  ** routine simpl
1c1d0 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  y stores NULLs i
1c1e0 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
1c1f0 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  emory cells..*/.
1c200 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
1c210 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
1c220 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
1c230 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
1c240 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1c250 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1c260 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
1c270 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
1c280 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f  ;.  if( pAggInfo
1c290 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f  ->nFunc+pAggInfo
1c2a0 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a  ->nColumn==0 ){.
1c2b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1c2c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
1c2d0 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
1c2e0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1c2f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c300 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49  P_Null, 0, pAggI
1c310 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
1c320 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46  m);.  }.  for(pF
1c330 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46  unc=pAggInfo->aF
1c340 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67  unc, i=0; i<pAgg
1c350 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
1c360 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20  , pFunc++){.    
1c370 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c380 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1c390 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20   pFunc->iMem);. 
1c3a0 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
1c3b0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
1c3c0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
1c3d0 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
1c3e0 20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74     if( pE->pList
1c3f0 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74  ==0 || pE->pList
1c400 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
1c410 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1c420 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44  orMsg(pParse, "D
1c430 49 53 54 49 4e 43 54 20 69 6e 20 61 67 67 72 65  ISTINCT in aggre
1c440 67 61 74 65 20 6d 75 73 74 20 62 65 20 66 6f 6c  gate must be fol
1c450 6c 6f 77 65 64 20 22 0a 20 20 20 20 20 20 20 20  lowed ".        
1c460 20 20 20 22 62 79 20 61 6e 20 65 78 70 72 65 73     "by an expres
1c470 73 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  sion");.        
1c480 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
1c490 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1c4a0 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49  se{.        KeyI
1c4b0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
1c4c0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
1c4d0 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
1c4e0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pList);.        
1c4f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c500 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
1c510 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44  meral, pFunc->iD
1c520 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  istinct, 0, 0,. 
1c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c540 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1c550 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
1c560 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
1c570 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
1c590 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c   the OP_AggFinal
1c5a0 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65  ize opcode for e
1c5b0 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66  very aggregate f
1c5c0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  unction.** in th
1c5d0 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
1c5e0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
1c5f0 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46  oid finalizeAggF
1c600 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a  unctions(Parse *
1c610 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
1c620 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
1c630 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1c640 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
1c650 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1c660 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72  _func *pF;.  for
1c670 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
1c680 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
1c690 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
1c6a0 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70  , pF++){.    Exp
1c6b0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
1c6c0 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b  F->pExpr->pList;
1c6d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c6e0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
1c6f0 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c  Final, pF->iMem,
1c700 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
1c710 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20  nExpr : 0, 0,.  
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c730 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
1c740 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
1c750 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1c760 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d  Update the accum
1c770 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65  ulator memory ce
1c780 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65  lls for an aggre
1c790 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  gate based on.**
1c7a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
1c7b0 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
1c7c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64  .static void upd
1c7d0 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  ateAccumulator(P
1c7e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
1c7f0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
1c800 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1c810 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1c820 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
1c830 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
1c840 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
1c850 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
1c860 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
1c870 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  de = 1;.  for(i=
1c880 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
1c890 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
1c8a0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
1c8b0 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  F++){.    int nA
1c8c0 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  rg;.    int addr
1c8d0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Next = 0;.    in
1c8e0 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78  t regAgg;.    Ex
1c8f0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
1c900 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74  pF->pExpr->pList
1c910 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
1c920 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
1c930 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
1c940 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
1c950 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
1c960 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
1c970 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c980 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
1c990 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
1c9a0 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Agg, 0);.    }el
1c9b0 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d  se{.      nArg =
1c9c0 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67   0;.      regAgg
1c9d0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1c9e0 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  if( pF->iDistinc
1c9f0 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64  t>=0 ){.      ad
1ca00 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  drNext = sqlite3
1ca10 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1ca20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ca30 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nArg==1 );.     
1ca40 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
1ca50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69  arse, pF->iDisti
1ca60 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31  nct, addrNext, 1
1ca70 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d  , regAgg);.    }
1ca80 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75  .    if( pF->pFu
1ca90 6e 63 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  nc->flags & SQLI
1caa0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
1cab0 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
1cac0 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
1cad0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
1cae0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1caf0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
1cb00 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
1cb10 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73  t!=0 );  /* pLis
1cb20 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e  t!=0 if pF->pFun
1cb30 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a  c has NEEDCOLL *
1cb40 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  /.      for(j=0,
1cb50 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
1cb60 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72   !pColl && j<nAr
1cb70 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  g; j++, pItem++)
1cb80 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
1cb90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
1cba0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
1cbb0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
1cbc0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
1cbd0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
1cbe0 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
1cbf0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
1cc00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1cc10 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1cc20 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
1cc30 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
1cc40 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
1cc50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1cc60 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1cc70 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c  , OP_AggStep, 0,
1cc80 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
1cc90 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
1cca0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
1ccb0 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
1ccc0 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
1ccd0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1cce0 76 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  v, nArg);.    sq
1ccf0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1cd00 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
1cd10 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
1cd20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1cd30 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
1cd40 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
1cd50 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
1cd60 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
1cd70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1cd80 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
1cd90 4e 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Next);.    }.  }
1cda0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
1cdb0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
1cdc0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
1cdd0 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
1cde0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1cdf0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1ce00 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
1ce10 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
1ce20 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
1ce30 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
1ce40 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1ce50 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  r the SELECT sta
1ce60 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20  tement given in 
1ce70 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20  the p argument. 
1ce80 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
1ce90 6c 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75  lts are distribu
1cea0 74 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77  ted in various w
1ceb0 61 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ays depending on
1cec0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
1ced0 20 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65   of the SelectDe
1cee0 73 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  st structure poi
1cef0 6e 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d  nted to by argum
1cf00 65 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20  ent pDest.** as 
1cf10 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1cf20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20     pDest->eDest 
1cf30 20 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20     Result.**    
1cf40 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20   ------------   
1cf50 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
1cf60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cf70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
1cf80 20 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20      SRT_Output  
1cf90 20 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 72      Generate a r
1cfa0 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73  ow of output (us
1cfb0 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c  ing the OP_Resul
1cfc0 74 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  tRow.**         
1cfd0 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f              opco
1cfe0 64 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77  de) for each row
1cff0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
1d000 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  et..**.**     SR
1d010 54 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e  T_Mem         On
1d020 6c 79 20 76 61 6c 69 64 20 69 66 20 74 68 65 20  ly valid if the 
1d030 72 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67  result is a sing
1d040 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20  le column..**   
1d050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d060 20 20 53 74 6f 72 65 20 74 68 65 20 66 69 72 73    Store the firs
1d070 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
1d080 66 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77  first result row
1d090 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d0a0 20 20 20 20 20 20 20 20 69 6e 20 72 65 67 69 73          in regis
1d0b0 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ter pDest->iParm
1d0c0 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74 68   then abandon th
1d0d0 65 20 72 65 73 74 0a 2a 2a 20 20 20 20 20 20 20  e rest.**       
1d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
1d0f0 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69   the query.  Thi
1d100 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 6d  s destination im
1d110 70 6c 69 65 73 20 22 4c 49 4d 49 54 20 31 22 2e  plies "LIMIT 1".
1d120 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53  .**.**     SRT_S
1d130 65 74 20 20 20 20 20 20 20 20 20 54 68 65 20 72  et         The r
1d140 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61 20  esult must be a 
1d150 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20  single column.  
1d160 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20 20  Store each.**   
1d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d180 20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 20    row of result 
1d190 61 73 20 74 68 65 20 6b 65 79 20 69 6e 20 74 61  as the key in ta
1d1a0 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
1d1b0 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  . .**           
1d1c0 20 20 20 20 20 20 20 20 20 20 41 70 70 6c 79 20            Apply 
1d1d0 74 68 65 20 61 66 66 69 6e 69 74 79 20 70 44 65  the affinity pDe
1d1e0 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 62 65 66  st->affinity bef
1d1f0 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 20  ore storing.**  
1d200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d210 20 20 20 72 65 73 75 6c 74 73 2e 20 20 55 73 65     results.  Use
1d220 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
1d230 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
1d240 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1d250 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
1d260 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
1d270 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
1d280 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
1d290 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
1d2a0 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20  SRT_Except      
1d2b0 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66  Remove results f
1d2c0 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rom the temporar
1d2d0 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
1d2e0 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
1d2f0 53 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20  SRT_Table       
1d300 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e  Store results in
1d310 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1d320 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
1d330 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d340 20 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69        This is li
1d350 6b 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20  ke SRT_EphemTab 
1d360 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
1d370 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
1d390 61 73 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61  assumed to alrea
1d3a0 64 79 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a  dy be open..**.*
1d3b0 2a 20 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54  *     SRT_EphemT
1d3c0 61 62 20 20 20 20 43 72 65 61 74 65 20 61 6e 20  ab    Create an 
1d3d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1d3e0 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 61 6e 64  pDest->iParm and
1d3f0 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20   store.**       
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
1d410 65 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20  e result there. 
1d420 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1d430 66 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a  ft open after.**
1d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d450 20 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20       returning. 
1d460 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52   This is like SR
1d470 54 5f 54 61 62 6c 65 20 65 78 63 65 70 74 20 74  T_Table except t
1d480 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1d490 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 20             this 
1d4a0 64 65 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73  destination uses
1d4b0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1d4c0 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20  l to create.**  
1d4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4e0 20 20 20 74 68 65 20 74 61 62 6c 65 20 66 69 72     the table fir
1d4f0 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  st..**.**     SR
1d500 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65  T_Coroutine   Ge
1d510 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74  nerate a co-rout
1d520 69 6e 65 20 74 68 61 74 20 72 65 74 75 72 6e 73  ine that returns
1d530 20 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a   a new row of.**
1d540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d550 20 20 20 20 20 72 65 73 75 6c 74 73 20 65 61 63       results eac
1d560 68 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76  h time it is inv
1d570 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79  oked.  The entry
1d580 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20   point.**       
1d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
1d5a0 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
1d5b0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
1d5c0 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61  ister pDest->iPa
1d5d0 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
1d5e0 54 5f 45 78 69 73 74 73 20 20 20 20 20 20 53 74  T_Exists      St
1d5f0 6f 72 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72  ore a 1 in memor
1d600 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50  y cell pDest->iP
1d610 61 72 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c  arm if the resul
1d620 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1d630 20 20 20 20 20 20 20 20 20 73 65 74 20 69 73 20           set is 
1d640 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a  not empty..**.**
1d650 20 20 20 20 20 53 52 54 5f 44 69 73 63 61 72 64       SRT_Discard
1d660 20 20 20 20 20 54 68 72 6f 77 20 74 68 65 20 72       Throw the r
1d670 65 73 75 6c 74 73 20 61 77 61 79 2e 20 20 54 68  esults away.  Th
1d680 69 73 20 69 73 20 75 73 65 64 20 62 79 20 53 45  is is used by SE
1d690 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  LECT.**         
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74              stat
1d6b0 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72  ements within tr
1d6c0 69 67 67 65 72 73 20 77 68 6f 73 65 20 6f 6e 6c  iggers whose onl
1d6d0 79 20 70 75 72 70 6f 73 65 20 69 73 0a 2a 2a 20  y purpose is.** 
1d6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6f0 20 20 20 20 74 68 65 20 73 69 64 65 2d 65 66 66      the side-eff
1d700 65 63 74 73 20 6f 66 20 66 75 6e 63 74 69 6f 6e  ects of function
1d710 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1d720 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1d730 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1d740 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f  rs.  If any erro
1d750 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e  rs are.** encoun
1d760 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61  tered, then an a
1d770 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
1d780 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
1d790 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a   in.** pParse->z
1d7a0 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
1d7b0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
1d7c0 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c  NOT free the Sel
1d7d0 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61  ect structure pa
1d7e0 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a  ssed in.  The.**
1d7f0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1d800 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68  n needs to do th
1d810 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  at..*/.int sqlit
1d820 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  e3Select(.  Pars
1d830 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1d840 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
1d850 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
1d860 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
1d870 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
1d880 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
1d890 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53  ng coded. */.  S
1d8a0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
1d8b0 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
1d8c0 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65   do with the que
1d8d0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
1d8e0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
1d8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1d900 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1d910 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1d920 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  o;     /* Return
1d930 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65   from sqlite3Whe
1d940 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56  reBegin() */.  V
1d950 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
1d960 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
1d970 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
1d980 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
1d990 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20  */.  int isAgg; 
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d9b0 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c  rue for select l
1d9c0 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74  ists like "count
1d9d0 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69  (*)" */.  ExprLi
1d9e0 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
1d9f0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75   /* List of colu
1da00 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20  mns to extract. 
1da10 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
1da20 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c  abList;     /* L
1da30 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f  ist of tables to
1da40 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a   select from */.
1da50 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
1da60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1da70 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
1da80 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1da90 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1daa0 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  By;    /* The OR
1dab0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
1dac0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1dad0 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
1dae0 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
1daf0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
1db00 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
1db10 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
1db20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1db30 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
1db40 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1db50 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b   int isDistinct;
1db60 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1db70 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
1db80 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
1db90 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74  nt */.  int dist
1dba0 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f  inct;          /
1dbb0 2a 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66  * Table to use f
1dbc0 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
1dbd0 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  set */.  int rc 
1dbe0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1dbf0 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
1dc00 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  rn from this fun
1dc10 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
1dc20 64 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20  ddrSortIndex;   
1dc30 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1dc40 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  an OP_OpenEpheme
1dc50 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
1dc60 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
1dc70 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
1dc80 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
1dc90 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
1dca0 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
1dcb0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
1dcc0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
1dcd0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
1dce0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
1dcf0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
1dd00 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1dd10 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
1dd20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1dd30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
1dd40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1dd50 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1dd60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1dd70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
1dd80 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1dd90 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
1dda0 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
1ddb0 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
1ddc0 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
1ddd0 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
1dde0 29 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d  );..  pOrderBy =
1ddf0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1de00 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64  if( IgnorableOrd
1de10 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
1de20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
1de30 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 20 74   0;..    /* In t
1de40 68 65 73 65 20 63 61 73 65 73 20 74 68 65 20 44  hese cases the D
1de50 49 53 54 49 4e 43 54 20 6f 70 65 72 61 74 6f 72  ISTINCT operator
1de60 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72   makes no differ
1de70 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20  ence to the.    
1de80 2a 2a 20 72 65 73 75 6c 74 73 2c 20 73 6f 20 72  ** results, so r
1de90 65 6d 6f 76 65 20 69 74 20 69 66 20 69 74 20 77  emove it if it w
1dea0 65 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a 20  ere specified.. 
1deb0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1dec0 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53  (pDest->eDest==S
1ded0 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65  RT_Exists || pDe
1dee0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55  st->eDest==SRT_U
1def0 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20  nion || .       
1df00 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
1df10 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
1df20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1df30 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20  T_Discard);.    
1df40 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
1df50 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  SF_Distinct;.  }
1df60 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1df70 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Prep(pParse, p, 
1df80 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  0);.  if( pParse
1df90 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 67 6f  ->nErr ){.    go
1dfa0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
1dfb0 20 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79   }.  p->pOrderBy
1dfc0 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 0a 20   = pOrderBy;... 
1dfd0 20 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63   /* Make local c
1dfe0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72  opies of the par
1dff0 61 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73  ameters for this
1e000 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
1e010 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
1e020 63 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d  c;.  isAgg = (p-
1e030 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
1e040 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
1e050 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
1e060 73 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  st;.  if( pEList
1e070 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
1e080 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20  t_end;..  /* .  
1e090 2a 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61  ** Do not even a
1e0a0 74 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61  ttempt to genera
1e0b0 74 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77  te any code if w
1e0c0 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73  e have already s
1e0d0 65 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20  een.  ** errors 
1e0e0 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
1e0f0 69 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f  ine starts..  */
1e100 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1e110 45 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c  Err>0 ) goto sel
1e120 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 4f  ect_end;..  /* O
1e130 52 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72  RDER BY is ignor
1e140 65 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74  ed for some dest
1e150 69 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  inations..  */. 
1e160 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
1e170 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
1e180 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
1e190 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
1e1a0 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
1e1b0 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
1e1c0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1e1d0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
1e1e0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
1e1f0 6e 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  nd;..  /* Genera
1e200 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
1e210 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
1e220 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
1e230 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
1e240 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1e250 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1e260 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1e270 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20  IEW).  for(i=0; 
1e280 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c  !p->pPrior && i<
1e290 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
1e2a0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
1e2b0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1e2c0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
1e2d0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
1e2e0 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
1e2f0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
1e300 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pItem->pSelect;.
1e310 20 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62      int isAggSub
1e320 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  ;..    if( pSub=
1e330 3d 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50  =0 || pItem->isP
1e340 6f 70 75 6c 61 74 65 64 20 29 20 63 6f 6e 74 69  opulated ) conti
1e350 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63  nue;..    /* Inc
1e360 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65  rement Parse.nHe
1e370 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67  ight by the heig
1e380 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ht of the larges
1e390 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  t expression.   
1e3a0 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 65 64   ** tree refered
1e3b0 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65   to by this, the
1e3c0 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20   parent select. 
1e3d0 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74  The child select
1e3e0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74  .    ** may cont
1e3f0 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ain expression t
1e400 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a  rees of at most.
1e410 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d      ** (SQLITE_M
1e420 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61  AX_EXPR_DEPTH-Pa
1e430 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69  rse.nHeight) hei
1e440 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62  ght. This is a b
1e450 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63  it.    ** more c
1e460 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e  onservative than
1e470 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20   necessary, but 
1e480 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e  much easier than
1e490 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a   enforcing.    *
1e4a0 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74  * an exact limit
1e4b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
1e4c0 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
1e4d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
1e4e0 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20  rHeight(p);..   
1e4f0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1e500 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
1e510 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64   can be absorbed
1e520 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
1e530 2e 20 2a 2f 0a 20 20 20 20 69 73 41 67 67 53 75  . */.    isAggSu
1e540 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c  b = (pSub->selFl
1e550 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
1e560 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20  te)!=0;.    if( 
1e570 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
1e580 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73  pParse, p, i, is
1e590 41 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29  Agg, isAggSub) )
1e5a0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67  {.      if( isAg
1e5b0 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  gSub ){.        
1e5c0 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  isAgg = 1;.     
1e5d0 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
1e5e0 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a  = SF_Aggregate;.
1e5f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20        }.      i 
1e600 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
1e610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
1e620 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
1e630 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62  st, SRT_EphemTab
1e640 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
1e650 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e660 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61   pItem->isPopula
1e670 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ted==0 );.      
1e680 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
1e690 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
1e6a0 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  t);.      pItem-
1e6b0 3e 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31  >isPopulated = 1
1e6c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e6d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1e6e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1e6f0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
1e700 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
1e710 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
1e720 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53  ight -= sqlite3S
1e730 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
1e740 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  p);.    pTabList
1e750 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
1e760 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
1e770 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
1e780 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
1e790 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
1e7a0 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
1e7b0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65   = p->pEList;.#e
1e7c0 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20  ndif.  pWhere = 
1e7d0 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
1e7e0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
1e7f0 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
1e800 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69   p->pHaving;.  i
1e810 73 44 69 73 74 69 6e 63 74 20 3d 20 28 70 2d 3e  sDistinct = (p->
1e820 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1e830 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66  stinct)!=0;..#if
1e840 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e850 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
1e860 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
1e870 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65  s are a sequence
1e880 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20   of queries, do 
1e890 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73  the earlier ones
1e8a0 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69   first..  */.  i
1e8b0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
1e8c0 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68      if( p->pRigh
1e8d0 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  tmost==0 ){.    
1e8e0 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c    Select *pLoop,
1e8f0 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20   *pRight = 0;.  
1e900 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
1e910 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c  .      int mxSel
1e920 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ect;.      for(p
1e930 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
1e940 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
1e950 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20  or, cnt++){.    
1e960 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68      pLoop->pRigh
1e970 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  tmost = p;.     
1e980 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20     pLoop->pNext 
1e990 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
1e9a0 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70    pRight = pLoop
1e9b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e9c0 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61  mxSelect = db->a
1e9d0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
1e9e0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
1e9f0 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d  CT];.      if( m
1ea00 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d  xSelect && cnt>m
1ea10 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  xSelect ){.     
1ea20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ea30 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
1ea40 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f  many terms in co
1ea50 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b  mpound SELECT");
1ea60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ea70 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1ea80 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
1ea90 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
1eaa0 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 23  p, pDest);.  }.#
1eab0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
1eac0 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
1ead0 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
1eae0 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
1eaf0 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
1eb00 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
1eb10 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1eb20 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1eb30 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75    if( checkForMu
1eb40 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
1eb50 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65  rror(pParse, pDe
1eb60 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st, pEList->nExp
1eb70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  r) ){.    goto s
1eb80 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
1eb90 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70  endif..  /* If p
1eba0 6f 73 73 69 62 6c 65 2c 20 72 65 77 72 69 74 65  ossible, rewrite
1ebb0 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 75 73   the query to us
1ebc0 65 20 47 52 4f 55 50 20 42 59 20 69 6e 73 74 65  e GROUP BY inste
1ebd0 61 64 20 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a  ad of DISTINCT..
1ebe0 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d 69    ** GROUP BY mi
1ebf0 67 68 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78  ght use an index
1ec00 2c 20 44 49 53 54 49 4e 43 54 20 6e 65 76 65 72  , DISTINCT never
1ec10 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   does..  */.  if
1ec20 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1ec30 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
1ec40 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
1ec50 5f 44 69 73 74 69 6e 63 74 20 26 26 20 21 70 2d  _Distinct && !p-
1ec60 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
1ec70 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
1ec80 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
1ec90 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29  p(db, p->pEList)
1eca0 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  ;.    pGroupBy =
1ecb0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
1ecc0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
1ecd0 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
1ece0 20 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20     isDistinct = 
1ecf0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
1ed00 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
1ed10 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
1ed20 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20  n this sorting. 
1ed30 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20   ** index might 
1ed40 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75  end up being unu
1ed50 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
1ed60 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74  can be .  ** ext
1ed70 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f  racted in pre-so
1ed80 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20  rted order.  If 
1ed90 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
1eda0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
1edb0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1edc0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
1edd0 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20  l be changed to 
1ede0 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a  an OP_Noop once.
1edf0 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f    ** we figure o
1ee00 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  ut that the sort
1ee10 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  ing index is not
1ee20 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64   needed.  The ad
1ee30 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a  drSortIndex.  **
1ee40 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
1ee50 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  d to facilitate 
1ee60 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a  that change..  *
1ee70 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
1ee80 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
1ee90 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70  *pKeyInfo;.    p
1eea0 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
1eeb0 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
1eec0 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b  arse, pOrderBy);
1eed0 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69  .    pOrderBy->i
1eee0 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  ECursor = pParse
1eef0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d  ->nTab++;.    p-
1ef00 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
1ef10 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78   = addrSortIndex
1ef20 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   =.      sqlite3
1ef30 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1ef40 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
1ef70 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70  rBy->iECursor, p
1ef80 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32  OrderBy->nExpr+2
1ef90 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
1efc0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
1efd0 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OFF);.  }else{. 
1efe0 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78     addrSortIndex
1eff0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
1f000 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   If the output i
1f010 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61  s destined for a
1f020 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1f030 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c  , open that tabl
1f040 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  e..  */.  if( pD
1f050 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
1f060 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
1f070 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f080 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
1f090 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50  meral, pDest->iP
1f0a0 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
1f0b0 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
1f0c0 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
1f0d0 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
1f0e0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1f0f0 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65  el(v);.  compute
1f100 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
1f110 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b  Parse, p, iEnd);
1f120 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69  ..  /* Open a vi
1f130 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
1f140 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
1f150 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
1f160 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29  if( isDistinct )
1f170 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
1f180 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73  KeyInfo;.    ass
1f190 65 72 74 28 20 69 73 41 67 67 20 7c 7c 20 70 47  ert( isAgg || pG
1f1a0 72 6f 75 70 42 79 20 29 3b 0a 20 20 20 20 64 69  roupBy );.    di
1f1b0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
1f1c0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65  >nTab++;.    pKe
1f1d0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
1f1e0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
1f1f0 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  se, p->pEList);.
1f200 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f210 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
1f220 45 70 68 65 6d 65 72 61 6c 2c 20 64 69 73 74 69  Ephemeral, disti
1f230 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f250 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
1f260 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
1f270 41 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65  ANDOFF);.  }else
1f280 7b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  {.    distinct =
1f290 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41   -1;.  }..  /* A
1f2a0 67 67 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e  ggregate and non
1f2b0 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
1f2c0 65 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64  es are handled d
1f2d0 69 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20  ifferently */.  
1f2e0 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47  if( !isAgg && pG
1f2f0 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20  roupBy==0 ){.   
1f300 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 69 73   /* This case is
1f310 20 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61   for non-aggrega
1f320 74 65 20 71 75 65 72 69 65 73 0a 20 20 20 20 2a  te queries.    *
1f330 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
1f340 62 61 73 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f  base scan.    */
1f350 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  .    pWInfo = sq
1f360 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1f370 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
1f380 2c 20 70 57 68 65 72 65 2c 20 26 70 4f 72 64 65  , pWhere, &pOrde
1f390 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  rBy, 0);.    if(
1f3a0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
1f3b0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20  o select_end;.. 
1f3c0 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67     /* If sorting
1f3d0 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20   index that was 
1f3e0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69  created by a pri
1f3f0 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
1f400 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ral .    ** inst
1f410 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70  ruction ended up
1f420 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65   not being neede
1f430 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74  d, then change t
1f440 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
1f450 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ral.    ** into 
1f460 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20  an OP_Noop..    
1f470 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53  */.    if( addrS
1f480 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70  ortIndex>=0 && p
1f490 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
1f4a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1f4b0 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
1f4c0 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 31 29  ddrSortIndex, 1)
1f4d0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
1f4e0 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
1f4f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
1f500 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
1f510 69 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a  inner loop.    *
1f520 2f 0a 20 20 20 20 61 73 73 65 72 74 28 21 69 73  /.    assert(!is
1f530 44 69 73 74 69 6e 63 74 29 3b 0a 20 20 20 20 73  Distinct);.    s
1f540 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
1f550 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
1f560 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
1f570 2c 20 2d 31 2c 20 70 44 65 73 74 2c 0a 20 20 20  , -1, pDest,.   
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
1f5a0 75 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ue, pWInfo->iBre
1f5b0 61 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  ak);..    /* End
1f5c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1f5d0 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
1f5e0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1f5f0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
1f600 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
1f610 73 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73  s is the process
1f620 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
1f630 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20  e queries */.   
1f640 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
1f650 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
1f660 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
1f670 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
1f680 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
1f690 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
1f6a0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
1f6b0 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
1f6c0 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
1f6d0 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
1f6e0 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
1f6f0 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
1f700 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
1f710 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
1f720 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
1f730 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
1f740 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
1f750 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
1f760 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f780 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
1f790 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
1f7a0 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
1f7b0 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7d0 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
1f7e0 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
1f7f0 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
1f800 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
1f810 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
1f820 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
1f830 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
1f840 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
1f850 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
1f860 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
1f870 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
1f880 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  rEnd;        /* 
1f890 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e  End of processin
1f8a0 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  g for this SELEC
1f8b0 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  T */..    /* Rem
1f8c0 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
1f8d0 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
1f8e0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
1f8f0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
1f900 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
1f910 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
1f920 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
1f930 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1f940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f950 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1f960 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
1f970 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1f980 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
1f990 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
1f9a0 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
1f9b0 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 2d  ..      for(i=p-
1f9c0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
1f9d0 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
1f9e0 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
1f9f0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
1fa00 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20  pItem->iAlias = 
1fa10 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1fa20 20 66 6f 72 28 69 3d 70 47 72 6f 75 70 42 79 2d   for(i=pGroupBy-
1fa30 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47  >nExpr, pItem=pG
1fa40 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3e 30 3b 20  roupBy->a; i>0; 
1fa50 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
1fa60 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41         pItem->iA
1fa70 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
1fa80 7d 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20 2f  }.    }.. .    /
1fa90 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c  * Create a label
1faa0 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e   to jump to when
1fab0 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72   we want to abor
1fac0 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  t the query */. 
1fad0 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c     addrEnd = sql
1fae0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1faf0 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  l(v);..    /* Co
1fb00 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20  nvert TK_COLUMN 
1fb10 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47  nodes into TK_AG
1fb20 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b  G_COLUMN and mak
1fb30 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20  e entries in.   
1fb40 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72   ** sAggInfo for
1fb50 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43   all TK_AGG_FUNC
1fb60 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78  TION nodes in ex
1fb70 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
1fb80 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  .    ** SELECT s
1fb90 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
1fba0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
1fbb0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
1fbc0 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
1fbd0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
1fbe0 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
1fbf0 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43  TabList;.    sNC
1fc00 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67  .pAggInfo = &sAg
1fc10 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49  gInfo;.    sAggI
1fc20 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  nfo.nSortingColu
1fc30 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20  mn = pGroupBy ? 
1fc40 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b  pGroupBy->nExpr+
1fc50 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  1 : 0;.    sAggI
1fc60 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
1fc70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
1fc80 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1fc90 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
1fca0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
1fcb0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
1fcc0 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72  ist(&sNC, pOrder
1fcd0 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61  By);.    if( pHa
1fce0 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  ving ){.      sq
1fcf0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
1fd00 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
1fd10 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
1fd20 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
1fd30 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
1fd40 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
1fd50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
1fd60 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
1fd70 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1fd80 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
1fd90 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
1fda0 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
1fdb0 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  r->pList);.    }
1fdc0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
1fdd0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
1fde0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
1fdf0 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20    /* Processing 
1fe00 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77  for aggregates w
1fe10 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20  ith GROUP BY is 
1fe20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61  very different a
1fe30 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d  nd.    ** much m
1fe40 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e  ore complex than
1fe50 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
1fe60 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
1fe70 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1fe80 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
1fe90 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1fea0 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
1feb0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
1fec0 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
1fed0 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
1fee0 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  j1;             
1fef0 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72  /* A-vs-B compar
1ff00 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20  ision jump */.  
1ff10 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70      int addrOutp
1ff20 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74  utRow;  /* Start
1ff30 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74   of subroutine t
1ff40 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65  hat outputs a re
1ff50 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
1ff60 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52    int regOutputR
1ff70 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ow;   /* Return 
1ff80 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
1ff90 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72   for output subr
1ffa0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20  outine */.      
1ffb0 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74  int addrSetAbort
1ffc0 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61  ;   /* Set the a
1ffd0 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65  bort flag and re
1ffe0 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  turn */.      in
1fff0 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b  t addrTopOfLoop;
20000 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
20010 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
20020 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74      int addrSort
20030 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f  ingIdx; /* The O
20040 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
20050 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  for the sorting 
20060 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
20070 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20  nt addrReset;   
20080 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
20090 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74   for resetting t
200a0 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a  he accumulator *
200b0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
200c0 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  eset;       /* R
200d0 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
200e0 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74  gister for reset
200f0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a   subroutine */..
20100 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
20110 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
20120 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
20130 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
20140 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
20150 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
20160 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
20170 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
20180 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
20190 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
201a0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
201b0 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
201c0 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
201d0 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
201e0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
201f0 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
20200 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
20210 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
20220 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
20230 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
20240 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
20250 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
20260 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29  Parse, pGroupBy)
20270 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
20280 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
20290 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
202a0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
202b0 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
202c0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
202d0 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
202e0 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20  gColumn, .      
202f0 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b      0, (char*)pK
20300 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
20310 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20  FO_HANDOFF);..  
20320 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
20330 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
20340 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
20350 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
20360 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
20370 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
20380 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
20390 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  m;.      iAbortF
203a0 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
203b0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f  nMem;.      regO
203c0 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61  utputRow = ++pPa
203d0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
203e0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
203f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
20400 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
20410 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61  regReset = ++pPa
20420 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
20430 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
20440 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
20450 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65  l(v);.      iAMe
20460 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
20470 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
20480 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
20490 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
204a0 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
204b0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
204c0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
204d0 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
204e0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
204f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20500 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41  P_Integer, 0, iA
20510 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
20520 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
20530 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
20540 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
20550 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20560 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
20570 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
20580 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
20590 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75  , "indicate accu
205a0 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29  mulator empty"))
205b0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
205c0 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
205d0 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
205e0 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
205f0 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
20600 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
20610 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
20620 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
20630 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
20640 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
20650 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
20660 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
20670 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
20680 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
20690 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
206a0 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
206b0 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
206c0 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
206d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
206e0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
206f0 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
20700 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57  Reset);.      pW
20710 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
20720 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
20730 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
20740 65 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30 29  e, &pGroupBy, 0)
20750 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
20760 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
20770 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
20780 66 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  f( pGroupBy==0 )
20790 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
207a0 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62   optimizer is ab
207b0 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f  le to deliver ro
207c0 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f  ws in group by o
207d0 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20  rder so.        
207e0 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76  ** we do not hav
207f0 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20  e to sort.  The 
20800 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
20810 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20   table will be. 
20820 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c         ** cancel
20830 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73  led later becaus
20840 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  e we still need 
20850 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49  to use the pKeyI
20860 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nfo.        */. 
20870 20 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20         pGroupBy 
20880 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
20890 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
208a0 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  rt = 0;.      }e
208b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
208c0 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20  Rows are coming 
208d0 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69  out in undetermi
208e0 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68  ned order.  We h
208f0 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20  ave to push.    
20900 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20      ** each row 
20910 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69  into a sorting i
20920 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20  ndex, terminate 
20930 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a  the first loop,.
20940 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
20950 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f  loop over the so
20960 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f  rting index in o
20970 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20  rder to get the 
20980 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a  output.        *
20990 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  * in sorted orde
209a0 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  r.        */.   
209b0 20 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65       int regBase
209c0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  ;.        int re
209d0 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20  gRecord;.       
209e0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20   int nCol;.     
209f0 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b     int nGroupBy;
20a00 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  ..        groupB
20a10 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
20a20 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47     nGroupBy = pG
20a30 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
20a40 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47         nCol = nG
20a50 72 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20  roupBy + 1;.    
20a60 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
20a70 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +1;.        for(
20a80 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
20a90 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
20aa0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67           if( sAg
20ab0 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53  gInfo.aCol[i].iS
20ac0 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
20ad0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  {.            nC
20ae0 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ol++;.          
20af0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
20b00 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
20b10 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73       regBase = s
20b20 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
20b30 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29  ge(pParse, nCol)
20b40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20b50 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
20b60 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
20b70 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b  By, regBase, 0);
20b80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20b90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20ba0 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49  _Sequence, sAggI
20bb0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72  nfo.sortingIdx,r
20bc0 65 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29  egBase+nGroupBy)
20bd0 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
20be0 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20  roupBy+1;.      
20bf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
20c00 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
20c10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
20c20 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
20c30 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49  l *pCol = &sAggI
20c40 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  nfo.aCol[i];.   
20c50 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
20c60 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  >iSorterColumn>=
20c70 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
20c80 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65   int r1 = j + re
20c90 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  gBase;.         
20ca0 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20     int r2;..    
20cb0 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
20cc0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
20cd0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20  olumn(pParse, . 
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
20d00 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e  ol->pTab, pCol->
20d10 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69  iColumn, pCol->i
20d20 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20  Table, r1, 0);. 
20d30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
20d40 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20  1!=r2 ){.       
20d50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20d60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
20d70 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20  Copy, r2, r1);. 
20d80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20d90 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
20da0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20db0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
20dc0 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
20dd0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
20de0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20df0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
20e00 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
20e10 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
20e20 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
20e30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20e40 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
20e50 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
20e60 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63  rtingIdx, regRec
20e70 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
20e80 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
20e90 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
20ea0 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
20eb0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
20ec0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
20ed0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a  regBase, nCol);.
20ee0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
20ef0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
20f00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20f10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20f20 5f 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  _Sort, sAggInfo.
20f30 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
20f40 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
20f50 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
20f60 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
20f70 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
20f80 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  o.useSortingIdx 
20f90 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
20fa0 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
20fb0 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
20fc0 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
20fd0 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
20fe0 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
20ff0 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
21000 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
21010 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
21020 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
21030 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
21040 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
21050 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
21060 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
21070 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
21080 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
21090 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
210a0 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
210b0 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
210c0 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
210d0 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
210e0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
210f0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
21100 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
21110 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
21120 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
21130 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
21140 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21150 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
21160 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
21170 49 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29  Idx, j, iBMem+j)
21180 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
21190 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
211a0 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d  nfo.directMode =
211b0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   1;.          sq
211c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
211d0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e  arse, pGroupBy->
211e0 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65  a[j].pExpr, iBMe
211f0 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  m+j);.        }.
21200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
21210 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
21220 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69  v, OP_Compare, i
21230 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72  AMem, iBMem, pGr
21240 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20  oupBy->nExpr,.  
21250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21260 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
21270 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
21280 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d  NFO);.      j1 =
21290 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
212a0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
212b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
212c0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
212d0 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a  j1+1, 0, j1+1);.
212e0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
212f0 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
21300 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
21310 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
21320 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
21330 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
21340 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
21350 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
21360 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
21370 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
21380 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
21390 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
213a0 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
213b0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
213c0 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
213d0 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
213e0 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
213f0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
21400 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
21410 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
21420 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
21430 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
21440 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
21450 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
21460 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
21470 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
21480 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
21490 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
214a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
214b0 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
214c0 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69  pParse, iBMem, i
214d0 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  AMem, pGroupBy->
214e0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
214f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21500 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
21510 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
21520 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
21530 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
21540 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77   "output one row
21550 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
21560 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21570 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74  OP_IfPos, iAbort
21580 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a  Flag, addrEnd);.
21590 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
215a0 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f  t((v, "check abo
215b0 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
215c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
215d0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
215e0 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
215f0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
21600 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
21610 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
21620 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
21630 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
21640 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
21650 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
21660 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
21670 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
21680 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21690 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
216a0 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
216b0 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
216c0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
216d0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
216e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
216f0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
21700 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20  , iUseFlag);.   
21710 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
21720 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74  v, "indicate dat
21730 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72  a in accumulator
21740 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  "));..      /* E
21750 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20  nd of the loop. 
21760 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
21770 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
21780 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21790 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
217a0 5f 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e  _Next, sAggInfo.
217b0 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
217c0 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  TopOfLoop);.    
217d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
217e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
217f0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
21800 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
21810 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
21820 72 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b  rSortingIdx, 1);
21830 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
21840 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69  /* Output the fi
21850 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  nal row of resul
21860 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
21870 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21880 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
21890 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
218a0 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
218b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
218c0 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61  (v, "output fina
218d0 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20  l row"));..     
218e0 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68   /* Jump over th
218f0 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20  e subroutines.  
21900 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
21910 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21920 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
21930 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f  drEnd);..      /
21940 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
21950 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
21960 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  puts a single ro
21970 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
21980 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54        ** set.  T
21990 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66  his subroutine f
219a0 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  irst looks at th
219b0 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20  e iUseFlag.  If 
219c0 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a  iUseFlag.      *
219d0 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
219e0 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
219f0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
21a00 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a  is a no-op.  If.
21a10 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f        ** the pro
21a20 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f  cessing calls fo
21a30 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61  r the query to a
21a40 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f  bort, this subro
21a50 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  utine.      ** i
21a60 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41  ncrements the iA
21a70 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20  bortFlag memory 
21a80 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
21a90 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20  returning in.   
21aa0 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73     ** order to s
21ab0 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72  ignal the caller
21ac0 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20   to abort..     
21ad0 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65   */.      addrSe
21ae0 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  tAbort = sqlite3
21af0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
21b00 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
21b10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21b20 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41  P_Integer, 1, iA
21b30 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
21b40 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
21b50 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67   "set abort flag
21b60 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
21b70 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
21b80 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
21b90 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
21ba0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
21bb0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f  veLabel(v, addrO
21bc0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
21bd0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
21be0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
21bf0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
21c00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21c10 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
21c20 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
21c30 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20  utputRow+2);.   
21c40 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
21c50 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75  v, "Groupby resu
21c60 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
21c70 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
21c80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21c90 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
21ca0 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
21cb0 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
21cc0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
21cd0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
21ce0 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69  .      if( pHavi
21cf0 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
21d00 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
21d10 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
21d20 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
21d30 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  1, SQLITE_JUMPIF
21d40 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
21d50 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
21d60 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
21d70 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
21d80 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   pOrderBy,.     
21d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21da0 20 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74   distinct, pDest
21db0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21dc0 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70          addrOutp
21dd0 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74  utRow+1, addrSet
21de0 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Abort);.      sq
21df0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
21e00 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
21e10 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
21e20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
21e30 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20  v, "end groupby 
21e40 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72  result generator
21e50 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  "));..      /* G
21e60 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
21e70 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72  tine that will r
21e80 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62  eset the group-b
21e90 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20  y accumulator.  
21ea0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
21eb0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
21ec0 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65  abel(v, addrRese
21ed0 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41  t);.      resetA
21ee0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
21ef0 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
21f00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21f10 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
21f20 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a  urn, regReset);.
21f30 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65       .    } /* e
21f40 6e 64 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f  ndif pGroupBy */
21f50 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  .    else {.    
21f60 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
21f70 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  Max = 0;.      E
21f80 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20  xprList *pDel = 
21f90 30 3b 0a 20 20 20 20 20 20 75 38 20 66 6c 61 67  0;.      u8 flag
21fa0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  ;..      /* Chec
21fb0 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  k if the query i
21fc0 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
21fd0 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
21fe0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
21ff0 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28  **   SELECT min(
22000 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
22010 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61    **   SELECT ma
22020 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  x(x) FROM ....  
22030 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
22040 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61  If it is, then a
22050 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77  sk the code in w
22060 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70  here.c to attemp
22070 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74  t to sort result
22080 73 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66  s.      ** as if
22090 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f   there was an "O
220a0 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f  RDER ON x" or "O
220b0 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20  RDER ON x DESC" 
220c0 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 2a  clause. .      *
220d0 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20  * If where.c is 
220e0 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20  able to produce 
220f0 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69  results sorted i
22100 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68  n this order, th
22110 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 64 64 20  en.      ** add 
22120 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65  vdbe code to bre
22130 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72  ak out of the pr
22140 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66  ocessing loop af
22150 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ter the .      *
22160 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  * first iteratio
22170 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72  n (since the fir
22180 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
22190 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20  the loop is .   
221a0 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
221b0 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
221c0 68 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20  he row with the 
221d0 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d  minimum or maxim
221e0 75 6d 20 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c  um .      ** val
221f0 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c  ue of x, the onl
22200 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e  y row required).
22210 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22220 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61  ** A special fla
22230 67 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64  g must be passed
22240 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
22250 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68  Begin() to sligh
22260 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64  tly.      ** mod
22270 69 66 79 20 62 65 68 61 76 69 6f 75 72 20 61 73  ify behaviour as
22280 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
22290 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  **.      **   + 
222a0 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
222b0 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
222c0 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70  ", then the loop
222d0 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20   coded by.      
222e0 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73  **     where.c s
222f0 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74  hould not iterat
22300 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65  e over any value
22310 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61  s with a NULL va
22320 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  lue.      **    
22330 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 2a 2a   for x..      **
22340 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68  .      **   + Th
22350 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65  e optimizer code
22360 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65   in where.c (the
22370 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69   thing that deci
22380 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20  des which.      
22390 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20  **     index or 
223a0 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20  indices to use) 
223b0 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64  should place a d
223c0 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74  ifferent priorit
223d0 79 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 20  y on .      **  
223e0 20 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68     satisfying th
223f0 65 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61  e 'ORDER BY' cla
22400 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73  use than it does
22410 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e   in other cases.
22420 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65  .      **     Re
22430 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20  fer to code and 
22440 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72  comments in wher
22450 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  e.c for details.
22460 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22470 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65  flag = minMaxQue
22480 72 79 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ry(pParse, p);. 
22490 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b       if( flag ){
224a0 0a 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20  .        pDel = 
224b0 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65  pMinMax = sqlite
224c0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
224d0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
224e0 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a  .pExpr->pList);.
224f0 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e          if( pMin
22500 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  Max && !db->mall
22510 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
22520 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
22530 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
22540 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45  flag!=WHERE_ORDE
22550 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20  RBY_MIN;.       
22560 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
22570 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f  .pExpr->op = TK_
22580 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
22590 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
225a0 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75   /* This case ru
225b0 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67  ns if the aggreg
225c0 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50  ate has no GROUP
225d0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65   BY clause.  The
225e0 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  .      ** proces
225f0 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d  sing is much sim
22600 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65  pler since there
22610 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   is only a singl
22620 65 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f  e row.      ** o
22630 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
22640 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  */.      resetAc
22650 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
22660 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
22670 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
22680 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
22690 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
226a0 20 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61   pWhere, &pMinMa
226b0 78 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20 20 20  x, flag);.      
226c0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b  if( pWInfo==0 ){
226d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
226e0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
226f0 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20  b, pDel);.      
22700 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
22710 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
22720 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
22730 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
22740 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
22750 20 21 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61   !pMinMax && fla
22760 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
22770 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22780 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57  , OP_Goto, 0, pW
22790 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20  Info->iBreak);. 
227a0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
227b0 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20  nt((v, "%s() by 
227c0 69 6e 64 65 78 22 2c 28 66 6c 61 67 3d 3d 57 48  index",(flag==WH
227d0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f  ERE_ORDERBY_MIN?
227e0 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a  "min":"max")));.
227f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
22800 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
22810 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 66 69 6e  Info);.      fin
22820 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
22830 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
22840 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 4f 72 64  nfo);.      pOrd
22850 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
22860 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
22870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
22880 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
22890 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
228a0 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
228b0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
228c0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
228d0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
228e0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
228f0 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  , 0, -1, .      
22900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22910 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20  pDest, addrEnd, 
22920 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20  addrEnd);..     
22930 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
22940 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
22950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
22960 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
22970 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  bel(v, addrEnd);
22980 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64  .    .  } /* end
22990 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65  if aggregate que
229a0 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  ry */..  /* If t
229b0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
229c0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
229d0 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
229e0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
229f0 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
22a00 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
22a10 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
22a20 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
22a30 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  ){.    generateS
22a40 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
22a50 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  p, v, pEList->nE
22a60 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  xpr, pDest);.  }
22a70 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
22a80 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
22a90 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
22aa0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
22ab0 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
22ac0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61  /* The SELECT wa
22ad0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
22ae0 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20  oded.   Set the 
22af0 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30  return code to 0
22b00 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
22b10 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a  e no errors..  *
22b20 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  /.  rc = 0;..  /
22b30 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
22b40 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
22b50 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
22b60 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
22b70 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
22b80 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
22b90 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
22ba0 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49  ect_end:..  /* I
22bb0 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e  dentify column n
22bc0 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20  ames if results 
22bd0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  of the SELECT ar
22be0 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a  e to be output..
22bf0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
22c00 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73  QLITE_OK && pDes
22c10 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
22c20 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65  tput ){.    gene
22c30 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
22c40 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
22c50 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
22c60 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
22c70 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  db, sAggInfo.aCo
22c80 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
22c90 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
22ca0 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72  .aFunc);.  retur
22cb0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  n rc;.}..#if def
22cc0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
22cd0 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  G)./*.**********
22ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d20 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  *****.** The fol
22d30 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20 75  lowing code is u
22d40 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
22d50 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
22d60 6c 79 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a  ly.  The code.**
22d70 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f   that follows do
22d80 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  es not appear in
22d90 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a   normal builds..
22da0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
22db0 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
22dc0 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20 63   print out the c
22dd0 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72  ontent of all or
22de0 20 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70   part of a .** p
22df0 61 72 73 65 20 73 74 72 75 63 74 75 72 65 73 20  arse structures 
22e00 73 75 63 68 20 61 73 20 53 65 6c 65 63 74 20 6f  such as Select o
22e10 72 20 45 78 70 72 2e 20 20 53 75 63 68 20 70 72  r Expr.  Such pr
22e20 69 6e 74 6f 75 74 73 20 61 72 65 20 75 73 65 66  intouts are usef
22e30 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e  ul.** for helpin
22e40 67 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  g to understand 
22e50 77 68 61 74 20 69 73 20 68 61 70 70 65 6e 69 6e  what is happenin
22e60 67 20 69 6e 73 69 64 65 20 74 68 65 20 63 6f 64  g inside the cod
22e70 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64  e generator.** d
22e80 75 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74  uring the execut
22e90 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53  ion of complex S
22ea0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
22eb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
22ec0 75 74 69 6e 65 20 61 72 65 20 6e 6f 74 20 63 61  utine are not ca
22ed0 6c 6c 65 64 20 61 6e 79 77 68 65 72 65 20 66 72  lled anywhere fr
22ee0 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f  om within the no
22ef0 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73  rmal.** code bas
22f00 65 2e 20 20 54 68 65 6e 20 61 72 65 20 69 6e 74  e.  Then are int
22f10 65 6e 64 65 64 20 74 6f 20 62 65 20 63 61 6c 6c  ended to be call
22f20 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ed from within t
22f30 68 65 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f  he debugger.** o
22f40 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79  r from temporary
22f50 20 22 70 72 69 6e 74 66 22 20 73 74 61 74 65 6d   "printf" statem
22f60 65 6e 74 73 20 69 6e 73 65 72 74 65 64 20 66 6f  ents inserted fo
22f70 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a  r debugging..*/.
22f80 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e  void sqlite3Prin
22f90 74 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a  tExpr(Expr *p){.
22fa0 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a    if( p->token.z
22fb0 20 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30   && p->token.n>0
22fc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
22fd0 65 62 75 67 50 72 69 6e 74 66 28 22 28 25 2e 2a  ebugPrintf("(%.*
22fe0 73 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  s", p->token.n, 
22ff0 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d  p->token.z);.  }
23000 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
23010 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25  3DebugPrintf("(%
23020 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a  d", p->op);.  }.
23030 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29    if( p->pLeft )
23040 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
23050 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20  ugPrintf(" ");. 
23060 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
23070 78 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  xpr(p->pLeft);. 
23080 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67   }.  if( p->pRig
23090 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
230a0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22  3DebugPrintf(" "
230b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
230c0 69 6e 74 45 78 70 72 28 70 2d 3e 70 52 69 67 68  intExpr(p->pRigh
230d0 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
230e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 22  3DebugPrintf(")"
230f0 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
23100 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 45  3PrintExprList(E
23110 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
23120 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
23130 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
23140 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
23150 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
23160 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
23170 72 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 4c  r);.    if( i<pL
23180 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a  ist->nExpr-1 ){.
23190 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
231a0 75 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a  ugPrintf(", ");.
231b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64      }.  }.}.void
231c0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c   sqlite3PrintSel
231d0 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
231e0 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71  nt indent){.  sq
231f0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23200 28 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29 20  ("%*sSELECT(%p) 
23210 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70  ", indent, "", p
23220 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69 6e  );.  sqlite3Prin
23230 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  tExprList(p->pEL
23240 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ist);.  sqlite3D
23250 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
23260 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20  ;.  if( p->pSrc 
23270 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72  ){.    char *zPr
23280 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b  efix;.    int i;
23290 0a 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22  .    zPrefix = "
232a0 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69  FROM";.    for(i
232b0 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  =0; i<p->pSrc->n
232c0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
232d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
232e0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
232f0 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  ->pSrc->a[i];.  
23300 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23310 50 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20 69  Printf("%*s ", i
23320 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78  ndent+6, zPrefix
23330 29 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69 78  );.      zPrefix
23340 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28   = "";.      if(
23350 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
23360 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23370 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
23380 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71  \n");.        sq
23390 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74  lite3PrintSelect
233a0 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c  (pItem->pSelect,
233b0 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20   indent+10);.   
233c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
233d0 67 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c 20  gPrintf("%*s)", 
233e0 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20  indent+8, "");. 
233f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
23400 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
23410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
23420 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20  bugPrintf("%s", 
23430 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
23440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23450 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a   pItem->pTab ){.
23460 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
23470 65 62 75 67 50 72 69 6e 74 66 28 22 28 74 61 62  ebugPrintf("(tab
23480 6c 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d 2d  le: %s)", pItem-
23490 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pTab->zName);. 
234a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
234b0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
234c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
234d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 41  3DebugPrintf(" A
234e0 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41  S %s", pItem->zA
234f0 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lias);.      }. 
23500 20 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70 53       if( i<p->pS
23510 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20  rc->nSrc-1 ){.  
23520 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
23530 75 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20  ugPrintf(",");. 
23540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
23550 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23560 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  "\n");.    }.  }
23570 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
23580 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
23590 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
235a0 57 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c  WHERE ", indent,
235b0 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
235c0 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 57  3PrintExpr(p->pW
235d0 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  here);.    sqlit
235e0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
235f0 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
23600 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
23610 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23620 69 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50 20  intf("%*s GROUP 
23630 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  BY ", indent, ""
23640 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
23650 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  intExprList(p->p
23660 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
23670 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23680 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ("\n");.  }.  if
23690 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  ( p->pHaving ){.
236a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
236b0 50 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56 49  Printf("%*s HAVI
236c0 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  NG ", indent, ""
236d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
236e0 69 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69  intExpr(p->pHavi
236f0 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
23700 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
23710 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
23720 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
23730 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23740 74 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42 59  tf("%*s ORDER BY
23750 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b   ", indent, "");
23760 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
23770 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  tExprList(p->pOr
23780 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
23790 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
237a0 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45  \n");.  }.}./* E
237b0 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  nd of the struct
237c0 75 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69  ure debug printi
237d0 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  ng code.********
237e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
237f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23820 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  *****/.#endif /*
23830 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
23840 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
23850 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 2a  (SQLITE_DEBUG) *
23860 2f 0a                                            /.