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

Artifact 8187927315ee592a8ee94d753b8a1a3625c33523:


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 37 31  select.c,v 1.471
0200: 20 32 30 30 38 2f 30 38 2f 32 36 20 31 32 3a 35   2008/08/26 12:5
0210: 36 3a 31 34 20 64 72 68 20 45 78 70 20 24 0a 2a  6:14 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: 61 73 73 65 72 74 28 20 70 4f 66 66 73 65 74 3d  assert( pOffset=
0a30: 3d 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20  =0 || pLimit!=0 
0a40: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  );.  pNew->pLimi
0a50: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e  t = pLimit;.  pN
0a60: 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f  ew->pOffset = pO
0a70: 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 61  ffset;.  pNew->a
0a80: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
0a90: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64   -1;.  pNew->add
0aa0: 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d  rOpenEphm[1] = -
0ab0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
0ac0: 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
0ad0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
0ae0: 63 46 61 69 6c 65 64 20 29 20 7b 0a 20 20 20 20  cFailed ) {.    
0af0: 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20  clearSelect(db, 
0b00: 70 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 70  pNew);.    if( p
0b10: 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 20  New!=&standin ) 
0b20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
0b30: 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 70 4e 65  , pNew);.    pNe
0b40: 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  w = 0;.  }.  ret
0b50: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
0b60: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69  ** Delete the gi
0b70: 76 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63  ven Select struc
0b80: 74 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20  ture and all of 
0b90: 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
0ba0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0bb0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73  e3SelectDelete(s
0bc0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
0bd0: 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  ct *p){.  if( p 
0be0: 29 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65  ){.    clearSele
0bf0: 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 73  ct(db, p);.    s
0c00: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
0c10: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
0c20: 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69  * Given 1 to 3 i
0c30: 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65  dentifiers prece
0c40: 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b  eding the JOIN k
0c50: 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e  eyword, determin
0c60: 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66  e the.** type of
0c70: 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61   join.  Return a
0c80: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
0c90: 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65  nt that expresse
0ca0: 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69  s that type.** i
0cb0: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
0cc0: 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c  ollowing bit val
0cd0: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a  ues:.**.**     J
0ce0: 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a  T_INNER.**     J
0cf0: 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a  T_CROSS.**     J
0d00: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
0d10: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
0d20: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
0d30: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
0d40: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
0d50: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
0d60: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
0d70: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
0d80: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
0d90: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
0da0: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
0db0: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
0dc0: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
0dd0: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
0de0: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
0df0: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
0e00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
0e10: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
0e20: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
0e30: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
0e40: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
0e50: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
0e60: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
0e70: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 73 74 61 74  Token *p;.  stat
0e80: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
0e90: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0ea0: 20 7a 4b 65 79 77 6f 72 64 5b 38 5d 3b 0a 20 20   zKeyword[8];.  
0eb0: 20 20 75 38 20 6e 43 68 61 72 3b 0a 20 20 20 20    u8 nChar;.    
0ec0: 75 38 20 63 6f 64 65 3b 0a 20 20 7d 20 6b 65 79  u8 code;.  } key
0ed0: 77 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  words[] = {.    
0ee0: 7b 20 22 6e 61 74 75 72 61 6c 22 2c 20 37 2c 20  { "natural", 7, 
0ef0: 4a 54 5f 4e 41 54 55 52 41 4c 20 7d 2c 0a 20 20  JT_NATURAL },.  
0f00: 20 20 7b 20 22 6c 65 66 74 22 2c 20 20 20 20 34    { "left",    4
0f10: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
0f20: 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 72 69 67  ER },.    { "rig
0f30: 68 74 22 2c 20 20 20 35 2c 20 4a 54 5f 52 49 47  ht",   5, JT_RIG
0f40: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
0f50: 20 20 20 7b 20 22 66 75 6c 6c 22 2c 20 20 20 20     { "full",    
0f60: 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49  4, JT_LEFT|JT_RI
0f70: 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a  GHT|JT_OUTER },.
0f80: 20 20 20 20 7b 20 22 6f 75 74 65 72 22 2c 20 20      { "outer",  
0f90: 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a   5, JT_OUTER },.
0fa0: 20 20 20 20 7b 20 22 69 6e 6e 65 72 22 2c 20 20      { "inner",  
0fb0: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 7d 2c 0a   5, JT_INNER },.
0fc0: 20 20 20 20 7b 20 22 63 72 6f 73 73 22 2c 20 20      { "cross",  
0fd0: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   5, JT_INNER|JT_
0fe0: 43 52 4f 53 53 20 7d 2c 0a 20 20 7d 3b 0a 20 20  CROSS },.  };.  
0ff0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c  int i, j;.  apAl
1000: 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41  l[0] = pA;.  apA
1010: 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70  ll[1] = pB;.  ap
1020: 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66  All[2] = pC;.  f
1030: 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61  or(i=0; i<3 && a
1040: 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  pAll[i]; i++){. 
1050: 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b     p = apAll[i];
1060: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1070: 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73 29  sizeof(keywords)
1080: 2f 73 69 7a 65 6f 66 28 6b 65 79 77 6f 72 64 73  /sizeof(keywords
1090: 5b 30 5d 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  [0]); j++){.    
10a0: 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 6b 65 79 77    if( p->n==keyw
10b0: 6f 72 64 73 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20  ords[j].nChar . 
10c0: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
10d0: 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61  te3StrNICmp((cha
10e0: 72 2a 29 70 2d 3e 7a 2c 20 6b 65 79 77 6f 72 64  r*)p->z, keyword
10f0: 73 5b 6a 5d 2e 7a 4b 65 79 77 6f 72 64 2c 20 70  s[j].zKeyword, p
1100: 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->n)==0 ){.     
1110: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 6b     jointype |= k
1120: 65 79 77 6f 72 64 73 5b 6a 5d 2e 63 6f 64 65 3b  eywords[j].code;
1130: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1140: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1150: 20 20 69 66 28 20 6a 3e 3d 73 69 7a 65 6f 66 28    if( j>=sizeof(
1160: 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66  keywords)/sizeof
1170: 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 20 29 7b  (keywords[0]) ){
1180: 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
1190: 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20  |= JT_ERROR;.   
11a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11b0: 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28    }.  if(.     (
11c0: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49  jointype & (JT_I
11d0: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d  NNER|JT_OUTER))=
11e0: 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55  =(JT_INNER|JT_OU
11f0: 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f  TER) ||.     (jo
1200: 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f  intype & JT_ERRO
1210: 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63  R)!=0.  ){.    c
1220: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d  onst char *zSp =
1230: 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74   " ";.    assert
1240: 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pB!=0 );.    i
1250: 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b  f( pC==0 ){ zSp+
1260: 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33  +; }.    sqlite3
1270: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1280: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73   "unknown or uns
1290: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
12a0: 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54  pe: ".       "%T
12b0: 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42   %T%s%T", pA, pB
12c0: 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20  , zSp, pC);.    
12d0: 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e  jointype = JT_IN
12e0: 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NER;.  }else if(
12f0: 20 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 52   jointype & JT_R
1300: 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  IGHT ){.    sqli
1310: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1320: 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48  se, .      "RIGH
1330: 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52  T and FULL OUTER
1340: 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63   JOINs are not c
1350: 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74  urrently support
1360: 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79  ed");.    jointy
1370: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
1380: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e   }.  return join
1390: 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  type;.}../*.** R
13a0: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
13b0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  of a column in a
13c0: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
13d0: 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  -1 if the column
13e0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  .** is not conta
13f0: 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c  ined in the tabl
1400: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1410: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62   columnIndex(Tab
1420: 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20  le *pTab, const 
1430: 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69  char *zCol){.  i
1440: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1450: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
1460: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
1470: 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62  ite3StrICmp(pTab
1480: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c  ->aCol[i].zName,
1490: 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75   zCol)==0 ) retu
14a0: 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
14b0: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
14c0: 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
14d0: 20 61 20 74 6f 6b 65 6e 20 74 6f 20 61 20 27 5c   a token to a '\
14e0: 30 30 30 27 2d 74 65 72 6d 69 6e 61 74 65 64 20  000'-terminated 
14f0: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
1500: 63 20 76 6f 69 64 20 73 65 74 54 6f 6b 65 6e 28  c void setToken(
1510: 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73 74 20  Token *p, const 
1520: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 70 2d 3e 7a  char *z){.  p->z
1530: 20 3d 20 28 75 38 2a 29 7a 3b 0a 20 20 70 2d 3e   = (u8*)z;.  p->
1540: 6e 20 3d 20 7a 20 3f 20 73 74 72 6c 65 6e 28 7a  n = z ? strlen(z
1550: 29 20 3a 20 30 3b 0a 20 20 70 2d 3e 64 79 6e 20  ) : 0;.  p->dyn 
1560: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
1570: 74 20 74 68 65 20 74 6f 6b 65 6e 20 74 6f 20 74  t the token to t
1580: 68 65 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64  he double-quoted
1590: 20 61 6e 64 20 65 73 63 61 70 65 64 20 76 65 72   and escaped ver
15a0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 72 69  sion of the stri
15b0: 6e 67 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  ng pointed.** to
15c0: 20 62 79 20 7a 2e 20 46 6f 72 20 65 78 61 6d 70   by z. For examp
15d0: 6c 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 7b 61 22  le;.**.**    {a"
15e0: 62 63 7d 20 20 2d 3e 20 20 7b 22 61 22 22 62 63  bc}  ->  {"a""bc
15f0: 22 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  "}.*/.static voi
1600: 64 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e  d setQuotedToken
1610: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1620: 54 6f 6b 65 6e 20 2a 70 2c 20 63 6f 6e 73 74 20  Token *p, const 
1630: 63 68 61 72 20 2a 7a 29 7b 0a 0a 20 20 2f 2a 20  char *z){..  /* 
1640: 43 68 65 63 6b 20 69 66 20 74 68 65 20 73 74 72  Check if the str
1650: 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ing contains any
1660: 20 22 20 63 68 61 72 61 63 74 65 72 73 2e 20 49   " characters. I
1670: 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 0a  f it does, then.
1680: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
1690: 6f 6e 20 77 69 6c 6c 20 6d 61 6c 6c 6f 63 20 73  on will malloc s
16a0: 70 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61  pace to create a
16b0: 20 71 75 6f 74 65 64 20 76 65 72 73 69 6f 6e 20   quoted version 
16c0: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 69  of.  ** the stri
16d0: 6e 67 20 69 6e 2e 20 4f 74 68 65 72 77 69 73 65  ng in. Otherwise
16e0: 2c 20 73 61 76 65 20 61 20 63 61 6c 6c 20 74 6f  , save a call to
16f0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1700: 29 20 62 79 0a 20 20 2a 2a 20 6a 75 73 74 20 63  ) by.  ** just c
1710: 6f 70 79 69 6e 67 20 74 68 65 20 70 6f 69 6e 74  opying the point
1720: 65 72 20 74 6f 20 74 68 65 20 73 74 72 69 6e 67  er to the string
1730: 2e 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ..  */.  const c
1740: 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 77  har *z2 = z;.  w
1750: 68 69 6c 65 28 20 2a 7a 32 20 29 7b 0a 20 20 20  hile( *z2 ){.   
1760: 20 69 66 28 20 2a 7a 32 3d 3d 27 22 27 20 29 20   if( *z2=='"' ) 
1770: 62 72 65 61 6b 3b 0a 20 20 20 20 7a 32 2b 2b 3b  break;.    z2++;
1780: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 2a 7a 32 20  .  }..  if( *z2 
1790: 29 7b 0a 20 20 20 20 2f 2a 20 53 74 72 69 6e 67  ){.    /* String
17a0: 20 63 6f 6e 74 61 69 6e 73 20 22 20 63 68 61 72   contains " char
17b0: 61 63 74 65 72 73 20 2d 20 63 6f 70 79 20 61 6e  acters - copy an
17c0: 64 20 71 75 6f 74 65 20 74 68 65 20 73 74 72 69  d quote the stri
17d0: 6e 67 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 7a 20  ng. */.    p->z 
17e0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
17f0: 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
1800: 62 2c 20 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b  b, "\"%w\"", z);
1810: 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 20 29 7b  .    if( p->z ){
1820: 0a 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20 73 74  .      p->n = st
1830: 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70 2d 3e  rlen((char *)p->
1840: 7a 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 79 6e  z);.      p->dyn
1850: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
1860: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 74 72 69  lse{.    /* Stri
1870: 6e 67 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 22  ng contains no "
1880: 20 63 68 61 72 61 63 74 65 72 73 20 2d 20 63 6f   characters - co
1890: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20  py the pointer. 
18a0: 2a 2f 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 28 75  */.    p->z = (u
18b0: 38 2a 29 7a 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d  8*)z;.    p->n =
18c0: 20 28 7a 32 20 2d 20 7a 29 3b 0a 20 20 20 20 70   (z2 - z);.    p
18d0: 2d 3e 64 79 6e 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ->dyn = 0;.  }.}
18e0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
18f0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  n expression nod
1900: 65 20 66 6f 72 20 61 6e 20 69 64 65 6e 74 69 66  e for an identif
1910: 69 65 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ier with the nam
1920: 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a 45 78  e of zName.*/.Ex
1930: 70 72 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74  pr *sqlite3Creat
1940: 65 49 64 45 78 70 72 28 50 61 72 73 65 20 2a 70  eIdExpr(Parse *p
1950: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
1960: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b  r *zName){.  Tok
1970: 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65 74 54  en dummy;.  setT
1980: 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 4e 61  oken(&dummy, zNa
1990: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  me);.  return sq
19a0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
19b0: 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  e, TK_ID, 0, 0, 
19c0: 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  &dummy);.}../*.*
19d0: 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20  * Add a term to 
19e0: 74 68 65 20 57 48 45 52 45 20 65 78 70 72 65 73  the WHERE expres
19f0: 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20  sion in *ppExpr 
1a00: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
1a10: 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e  e.** zCol column
1a20: 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20   to be equal in 
1a30: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70  the two tables p
1a40: 54 61 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a  Tab1 and pTab2..
1a50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
1a60: 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50  ddWhereTerm(.  P
1a70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1a80: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1a90: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1aa0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1ab0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
1ac0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a   of the column *
1ad0: 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20  /.  const Table 
1ae0: 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f 2a 20  *pTab1,      /* 
1af0: 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20  First table */. 
1b00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c   const char *zAl
1b10: 69 61 73 31 2c 20 20 20 20 20 2f 2a 20 41 6c 69  ias1,     /* Ali
1b20: 61 73 20 66 6f 72 20 66 69 72 73 74 20 74 61 62  as for first tab
1b30: 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  le.  May be NULL
1b40: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c   */.  const Tabl
1b50: 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20 20 2f  e *pTab2,      /
1b60: 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a  * Second table *
1b70: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1b80: 7a 41 6c 69 61 73 32 2c 20 20 20 20 20 2f 2a 20  zAlias2,     /* 
1b90: 41 6c 69 61 73 20 66 6f 72 20 73 65 63 6f 6e 64  Alias for second
1ba0: 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20   table.  May be 
1bb0: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52  NULL */.  int iR
1bc0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 2c 20 20  ightJoinTable,  
1bd0: 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
1be0: 72 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20  r for the right 
1bf0: 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20  table */.  Expr 
1c00: 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20 20 20  **ppExpr,       
1c10: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65      /* Add the e
1c20: 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74 6f 20  quality term to 
1c30: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
1c40: 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72  */.  int isOuter
1c50: 4a 6f 69 6e 20 20 20 20 20 20 20 20 20 20 2f 2a  Join          /*
1c60: 20 54 72 75 65 20 69 66 20 64 65 61 6c 69 6e 67   True if dealing
1c70: 20 77 69 74 68 20 61 6e 20 4f 55 54 45 52 20 6a   with an OUTER j
1c80: 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  oin */.){.  Expr
1c90: 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a   *pE1a, *pE1b, *
1ca0: 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45  pE1c;.  Expr *pE
1cb0: 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63  2a, *pE2b, *pE2c
1cc0: 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20  ;.  Expr *pE;.. 
1cd0: 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65 33 43   pE1a = sqlite3C
1ce0: 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72  reateIdExpr(pPar
1cf0: 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70 45 32  se, zCol);.  pE2
1d00: 61 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  a = sqlite3Creat
1d10: 65 49 64 45 78 70 72 28 70 50 61 72 73 65 2c 20  eIdExpr(pParse, 
1d20: 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 41 6c  zCol);.  if( zAl
1d30: 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  ias1==0 ){.    z
1d40: 41 6c 69 61 73 31 20 3d 20 70 54 61 62 31 2d 3e  Alias1 = pTab1->
1d50: 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 31  zName;.  }.  pE1
1d60: 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  b = sqlite3Creat
1d70: 65 49 64 45 78 70 72 28 70 50 61 72 73 65 2c 20  eIdExpr(pParse, 
1d80: 7a 41 6c 69 61 73 31 29 3b 0a 20 20 69 66 28 20  zAlias1);.  if( 
1d90: 7a 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a 20 20  zAlias2==0 ){.  
1da0: 20 20 7a 41 6c 69 61 73 32 20 3d 20 70 54 61 62    zAlias2 = pTab
1db0: 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  2->zName;.  }.  
1dc0: 70 45 32 62 20 3d 20 73 71 6c 69 74 65 33 43 72  pE2b = sqlite3Cr
1dd0: 65 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73  eateIdExpr(pPars
1de0: 65 2c 20 7a 41 6c 69 61 73 32 29 3b 0a 20 20 70  e, zAlias2);.  p
1df0: 45 31 63 20 3d 20 73 71 6c 69 74 65 33 50 45 78  E1c = sqlite3PEx
1e00: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
1e10: 54 2c 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30  T, pE1b, pE1a, 0
1e20: 29 3b 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69  );.  pE2c = sqli
1e30: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
1e40: 20 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20 70   TK_DOT, pE2b, p
1e50: 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d 20  E2a, 0);.  pE = 
1e60: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1e70: 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 63  rse, TK_EQ, pE1c
1e80: 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20 69 66  , pE2c, 0);.  if
1e90: 28 20 70 45 20 26 26 20 69 73 4f 75 74 65 72 4a  ( pE && isOuterJ
1ea0: 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53  oin ){.    ExprS
1eb0: 65 74 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  etProperty(pE, E
1ec0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
1ed0: 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54   pE->iRightJoinT
1ee0: 61 62 6c 65 20 3d 20 69 52 69 67 68 74 4a 6f 69  able = iRightJoi
1ef0: 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70  nTable;.  }.  *p
1f00: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
1f10: 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
1f20: 62 2c 2a 70 70 45 78 70 72 2c 20 70 45 29 3b 0a  b,*ppExpr, pE);.
1f30: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1f40: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
1f50: 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72  perty on all ter
1f60: 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ms of the given 
1f70: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41  expression..** A
1f80: 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e  nd set the Expr.
1f90: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1fa0: 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76  to iTable for ev
1fb0: 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a  ery term in the.
1fc0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ** expression..*
1fd0: 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d  *.** The EP_From
1fe0: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73  Join property is
1ff0: 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f   used on terms o
2000: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
2010: 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c  to tell.** the L
2020: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70  EFT OUTER JOIN p
2030: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
2040: 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69  that this term i
2050: 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  s part of the.**
2060: 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f   join restrictio
2070: 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  n specified in t
2080: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
2090: 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20  lause and not a 
20a0: 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  part.** of the m
20b0: 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52  ore general WHER
20c0: 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65  E clause.  These
20d0: 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64   terms are moved
20e0: 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20   over to the.** 
20f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72  WHERE clause dur
2100: 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73  ing join process
2110: 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20  ing but we need 
2120: 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
2130: 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61   they.** origina
2140: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
2150: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
2160: 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52  *.** The Expr.iR
2170: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65  ightJoinTable te
2180: 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c  lls the WHERE cl
2190: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
21a0: 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72  that the.** expr
21b0: 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f  ession depends o
21c0: 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f  n table iRightJo
21d0: 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20  inTable even if 
21e0: 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f  that table is no
21f0: 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20  t.** explicitly 
2200: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
2210: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
2220: 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  at information i
2230: 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20  s needed.** for 
2240: 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a  cases like this:
2250: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
2260: 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
2270: 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
2280: 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a  t2.b AND t1.x=5.
2290: 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20  **.** The where 
22a0: 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20  clause needs to 
22b0: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
22c0: 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35  ng of the t1.x=5
22d0: 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61  .** term until a
22e0: 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70  fter the t2 loop
22f0: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49   of the join.  I
2300: 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a  n that way, a.**
2310: 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c   NULL t2 row wil
2320: 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68  l be inserted wh
2330: 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20  enever t1.x!=5. 
2340: 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a   If we do not.**
2350: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
2360: 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69  ing of t1.x=5, i
2370: 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73  t will be proces
2380: 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  sed immediately.
2390: 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20  ** after the t1 
23a0: 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69  loop and rows wi
23b0: 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20  th t1.x!=5 will 
23c0: 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a  never appear in.
23d0: 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77  ** the output, w
23e0: 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63  hich is incorrec
23f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2400: 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  d setJoinExpr(Ex
2410: 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  pr *p, int iTabl
2420: 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e){.  while( p )
2430: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
2440: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
2450: 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d 3e 69 52  Join);.    p->iR
2460: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
2470: 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a  iTable;.    setJ
2480: 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74  oinExpr(p->pLeft
2490: 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  , iTable);.    p
24a0: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
24b0: 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  } .}../*.** This
24c0: 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73   routine process
24d0: 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f  es the join info
24e0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45  rmation for a SE
24f0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2500: 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  ** ON and USING 
2510: 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76  clauses are conv
2520: 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61  erted into extra
2530: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
2540: 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e  ERE clause..** N
2550: 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73  ATURAL joins als
2560: 6f 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57  o create extra W
2570: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
2580: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  s..**.** The ter
2590: 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61  ms of a FROM cla
25a0: 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  use are containe
25b0: 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e  d in the Select.
25c0: 70 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a  pSrc structure..
25d0: 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74  ** The left most
25e0: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69   table is the fi
25f0: 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c  rst entry in Sel
2600: 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72  ect.pSrc.  The r
2610: 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62  ight-most.** tab
2620: 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65  le is the last e
2630: 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20  ntry.  The join 
2640: 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64  operator is held
2650: 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f   in the entry to
2660: 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54  .** the left.  T
2670: 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74  hus entry 0 cont
2680: 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ains the join op
2690: 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  erator for the j
26a0: 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65  oin between.** e
26b0: 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20  ntries 0 and 1. 
26c0: 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47   Any ON or USING
26d0: 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61   clauses associa
26e0: 74 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69  ted with the joi
26f0: 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74  n are.** also at
2700: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
2710: 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20  ft entry..**.** 
2720: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
2730: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
2740: 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e  of errors encoun
2750: 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  tered..*/.static
2760: 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65   int sqliteProce
2770: 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50  ssJoin(Parse *pP
2780: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
2790: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
27a0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
27b0: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65      /* All table
27c0: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
27d0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ause */.  int i,
27e0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
27f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2800: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
2810: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2820: 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  tem *pLeft;     
2830: 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65  /* Left table be
2840: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20  ing joined */.  
2850: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2860: 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20  tem *pRight;    
2870: 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62  /* Right table b
2880: 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a  eing joined */..
2890: 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
28a0: 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72  ;.  pLeft = &pSr
28b0: 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68  c->a[0];.  pRigh
28c0: 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20  t = &pLeft[1];. 
28d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
28e0: 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70  ->nSrc-1; i++, p
28f0: 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b  Right++, pLeft++
2900: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c  ){.    Table *pL
2910: 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e  eftTab = pLeft->
2920: 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20  pTab;.    Table 
2930: 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69  *pRightTab = pRi
2940: 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  ght->pTab;.    i
2950: 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20  nt isOuter;..   
2960: 20 69 66 28 20 70 4c 65 66 74 54 61 62 3d 3d 30   if( pLeftTab==0
2970: 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30   || pRightTab==0
2980: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2990: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
29a0: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
29b0: 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20  T_OUTER)!=0;..  
29c0: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41    /* When the NA
29d0: 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73  TURAL keyword is
29e0: 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48   present, add WH
29f0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
2a00: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72   for.    ** ever
2a10: 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  y column that th
2a20: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76  e two tables hav
2a30: 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20  e in common..   
2a40: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
2a50: 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  ht->jointype & J
2a60: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
2a70: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2a80: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
2a90: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
2aa0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2ab0: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
2ac0: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
2ad0: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
2ae0: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
2af0: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
2b00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2b10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2b20: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74 54  or(j=0; j<pLeftT
2b30: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
2b40: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
2b50: 61 6d 65 20 3d 20 70 4c 65 66 74 54 61 62 2d 3e  ame = pLeftTab->
2b60: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
2b70: 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d         if( colum
2b80: 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62  nIndex(pRightTab
2b90: 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
2ba0: 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72           addWher
2bb0: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e  eTerm(pParse, zN
2bc0: 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70  ame, pLeftTab, p
2bd0: 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20  Left->zAlias, . 
2be0: 20 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 70 52 69               pRi
2c00: 67 68 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e  ghtTab, pRight->
2c10: 7a 41 6c 69 61 73 2c 0a 20 20 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 70 52 69 67 68 74 2d 3e 69 43        pRight->iC
2c40: 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72  ursor, &p->pWher
2c50: 65 2c 20 69 73 4f 75 74 65 72 29 3b 0a 20 20 20  e, isOuter);.   
2c60: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
2c70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2c80: 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77  .    /* Disallow
2c90: 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49   both ON and USI
2ca0: 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68  NG clauses in th
2cb0: 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20  e same join.    
2cc0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
2cd0: 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74  t->pOn && pRight
2ce0: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
2cf0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2d00: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
2d10: 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61  t have both ON a
2d20: 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20  nd USING ".     
2d30: 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74     "clauses in t
2d40: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a  he same join");.
2d50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2d60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
2d70: 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  d the ON clause 
2d80: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
2d90: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
2da0: 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20  connected by.   
2db0: 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   ** an AND opera
2dc0: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
2dd0: 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20  if( pRight->pOn 
2de0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  ){.      if( isO
2df0: 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78  uter ) setJoinEx
2e00: 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20  pr(pRight->pOn, 
2e10: 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29  pRight->iCursor)
2e20: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72  ;.      p->pWher
2e30: 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  e = sqlite3ExprA
2e40: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  nd(pParse->db, p
2e50: 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74  ->pWhere, pRight
2e60: 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52  ->pOn);.      pR
2e70: 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20  ight->pOn = 0;. 
2e80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
2e90: 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20  ate extra terms 
2ea0: 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  on the WHERE cla
2eb0: 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  use for each col
2ec0: 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a  umn named.    **
2ed0: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
2ee0: 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20  ause.  Example: 
2ef0: 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  If the two table
2f00: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61  s to be joined a
2f10: 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64  re .    ** A and
2f20: 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47   B and the USING
2f30: 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c   clause names X,
2f40: 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20   Y, and Z, then 
2f50: 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  add this.    ** 
2f60: 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
2f70: 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20  use:    A.X=B.X 
2f80: 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20  AND A.Y=B.Y AND 
2f90: 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52  A.Z=B.Z.    ** R
2fa0: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
2fb0: 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e  f any column men
2fc0: 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53  tioned in the US
2fd0: 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20  ING clause is.  
2fe0: 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e    ** not contain
2ff0: 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  ed in both table
3000: 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a  s to be joined..
3010: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
3020: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3030: 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70  .      IdList *p
3040: 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70  List = pRight->p
3050: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72  Using;.      for
3060: 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e  (j=0; j<pList->n
3070: 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; j++){.      
3080: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
3090: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  pList->a[j].zNam
30a0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  e;.        if( c
30b0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74  olumnIndex(pLeft
30c0: 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c  Tab, zName)<0 ||
30d0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69   columnIndex(pRi
30e0: 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30  ghtTab, zName)<0
30f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
3100: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3110: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f  arse, "cannot jo
3120: 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20  in using column 
3130: 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20  %s - column ".  
3140: 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70            "not p
3150: 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74  resent in both t
3160: 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ables", zName);.
3170: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3180: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
3190: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
31a0: 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  rm(pParse, zName
31b0: 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66  , pLeftTab, pLef
31c0: 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20  t->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 70 52 69 67 68 74 54 61          pRightTa
31f0: 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61  b, pRight->zAlia
3200: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3220: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20  Right->iCursor, 
3230: 26 70 2d 3e 70 57 68 65 72 65 2c 20 69 73 4f 75  &p->pWhere, isOu
3240: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
3250: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3260: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
3270: 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76  ert code into "v
3280: 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  " that will push
3290: 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74   the record on t
32a0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
32b0: 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20   stack into the 
32c0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
32d0: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
32e0: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
32f0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3300: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
3310: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
3320: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a  *pOrderBy,    /*
3330: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
3340: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
3350: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
3360: 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45   /* The whole SE
3370: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
3380: 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 20  /.  int regData 
3390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
33a0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
33b0: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
33c0: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
33d0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
33e0: 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20  ;.  int nExpr = 
33f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
3400: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d  .  int regBase =
3410: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
3420: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78  ange(pParse, nEx
3430: 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67  pr+2);.  int reg
3440: 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
3450: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
3460: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
3470: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
3480: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
3490: 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 73  regBase, 0);.  s
34a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
34b0: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
34c0: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
34d0: 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  sor, regBase+nEx
34e0: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
34f0: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
3500: 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67 42  e, regData, regB
3510: 61 73 65 2b 6e 45 78 70 72 2b 31 2c 20 31 29 3b  ase+nExpr+1, 1);
3520: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
3530: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
3540: 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20  ecord, regBase, 
3550: 6e 45 78 70 72 20 2b 20 32 2c 20 72 65 67 52 65  nExpr + 2, regRe
3560: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
3570: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3580: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4f 72 64  _IdxInsert, pOrd
3590: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
35a0: 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
35b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
35c0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
35d0: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
35e0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
35f0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
3600: 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69  e, nExpr+2);.  i
3610: 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  f( pSelect->iLim
3620: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  it ){.    int ad
3630: 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20  dr1, addr2;.    
3640: 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20  int iLimit;.    
3650: 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  if( pSelect->iOf
3660: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c  fset ){.      iL
3670: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
3680: 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d  iOffset+1;.    }
3690: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d  else{.      iLim
36a0: 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c  it = pSelect->iL
36b0: 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  imit;.    }.    
36c0: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
36d0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
36e0: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b  IfZero, iLimit);
36f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3700: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
3710: 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29  Imm, iLimit, -1)
3720: 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
3730: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
3740: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
3750: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
3760: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
3770: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3780: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp1(v, OP_Last
3790: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
37a0: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
37b0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
37c0: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72 64 65  OP_Delete, pOrde
37d0: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  rBy->iECursor);.
37e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
37f0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32  umpHere(v, addr2
3800: 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e  );.    pSelect->
3810: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  iLimit = 0;.  }.
3820: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
3830: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
3840: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
3850: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
3860: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
3870: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
3880: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
3890: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65  his VM */.  Sele
38a0: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
38b0: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
38c0: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
38d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
38e0: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
38f0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
3900: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
3910: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
3920: 69 4f 66 66 73 65 74 20 26 26 20 69 43 6f 6e 74  iOffset && iCont
3930: 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69  inue!=0 ){.    i
3940: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    sql
3950: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3960: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
3970: 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20  iOffset, -1);.  
3980: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
3990: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
39a0: 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73  _IfNeg, p->iOffs
39b0: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
39c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
39d0: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69  _Goto, 0, iConti
39e0: 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  nue);.    VdbeCo
39f0: 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20  mment((v, "skip 
3a00: 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29  OFFSET records")
3a10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3a20: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3a30: 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  dr);.  }.}../*.*
3a40: 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20  * Add code that 
3a50: 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61  will check to ma
3a60: 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65  ke sure the N re
3a70: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
3a80: 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d   at iMem.** form
3a90: 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72   a distinct entr
3aa0: 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f  y.  iTab is a so
3ab0: 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
3ac0: 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c   holds previousl
3ad0: 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e  y.** seen combin
3ae0: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20  ations of the N 
3af0: 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65  values.  A new e
3b00: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20  ntry is made in 
3b10: 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63  iTab.** if the c
3b20: 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20  urrent N values 
3b30: 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41  are new..**.** A
3b40: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70   jump to addrRep
3b50: 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20  eat is made and 
3b60: 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61  the N+1 values a
3b70: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
3b80: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
3b90: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
3ba0: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
3bb0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
3bc0: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
3bd0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
3be0: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
3bf0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
3c00: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
3c10: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
3c20: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
3c30: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
3c40: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
3c50: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
3c60: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
3c70: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
3c80: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
3c90: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
3ca0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3cb0: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  of elements */. 
3cc0: 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20   int iMem       
3cd0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65      /* First ele
3ce0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
3cf0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a  e *v;.  int r1;.
3d00: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
3d10: 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c  Vdbe;.  r1 = sql
3d20: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
3d30: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
3d40: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
3d50: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d  P_MakeRecord, iM
3d60: 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71  em, N, r1);.  sq
3d70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
3d80: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
3d90: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 72  b, addrRepeat, r
3da0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
3db0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
3dc0: 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72  xInsert, iTab, r
3dd0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
3de0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
3df0: 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  se, r1);.}../*.*
3e00: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72  * Generate an er
3e10: 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e  ror message when
3e20: 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73 65   a SELECT is use
3e30: 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65 78  d within a subex
3e40: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61  pression.** (exa
3e50: 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45  mple:  "a IN (SE
3e60: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c  LECT * FROM tabl
3e70: 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73 20  e)") but it has 
3e80: 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73 75  more than 1 resu
3e90: 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57  lt.** column.  W
3ea0: 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73  e do this in a s
3eb0: 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73  ubroutine becaus
3ec0: 65 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  e the error occu
3ed0: 72 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a  rs in multiple.*
3ee0: 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73 74 61  * places..*/.sta
3ef0: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72  tic int checkFor
3f00: 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
3f10: 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20  tError(.  Parse 
3f20: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
3f30: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e  * Parse context.
3f40: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
3f50: 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65   *pDest,   /* De
3f60: 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c  stination of SEL
3f70: 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ECT results */. 
3f80: 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20   int nExpr      
3f90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3fa0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
3fb0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  s returned by SE
3fc0: 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  LECT */.){.  int
3fd0: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
3fe0: 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78  eDest;.  if( nEx
3ff0: 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d  pr>1 && (eDest==
4000: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
4010: 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20  ==SRT_Set) ){.  
4020: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4030: 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20  g(pParse, "only 
4040: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
4050: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20  allowed for ".  
4060: 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74       "a SELECT t
4070: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
4080: 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
4090: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
40a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
40b0: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
40c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
40d0: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
40e0: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
40f0: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
4100: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
4110: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
4120: 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61  ab and nColumn a
4130: 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68  re both zero, th
4140: 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78  en the pEList ex
4150: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
4160: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
4170: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
4180: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
4190: 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a  .  If nColumn>0.
41a0: 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  ** then data is 
41b0: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
41c0: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
41d0: 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65   used only to ge
41e0: 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70  t the.** datatyp
41f0: 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  es for each colu
4200: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
4210: 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  id selectInnerLo
4220: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
4230: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
4240: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
4250: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
4260: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
4270: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
4280: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
4290: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
42a0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
42b0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist,       /* Li
42c0: 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69  st of values bei
42d0: 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ng extracted */.
42e0: 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20    int srcTab,   
42f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c            /* Pul
4300: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  l data from this
4310: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
4320: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  nColumn,        
4330: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4340: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
4350: 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a  source table */.
4360: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
4370: 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20  erBy,     /* If 
4380: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72  not NULL, sort r
4390: 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69  esults using thi
43a0: 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  s key */.  int d
43b0: 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20  istinct,        
43c0: 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61     /* If >=0, ma
43d0: 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74 73 20  ke sure results 
43e0: 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a  are distinct */.
43f0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
4400: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77  est,      /* How
4410: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
4420: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
4430: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
4440: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
4450: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
4460: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
4470: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
4480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
4490: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
44a0: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
44b0: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
44c0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
44d0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
44e0: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
44f0: 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
4500: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
4510: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
4520: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
4530: 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20  regResult;      
4540: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
4550: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
4560: 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  ng result set */
4570: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
4580: 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f  Dest->eDest;   /
4590: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
45a0: 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20   of results */. 
45b0: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
45c0: 73 74 2d 3e 69 50 61 72 6d 3b 20 20 20 2f 2a 20  st->iParm;   /* 
45d0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
45e0: 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  o disposal metho
45f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75  d */.  int nResu
4600: 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  ltCol;          
4610: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4620: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
4630: 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  /..  if( v==0 ) 
4640: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
4650: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
4660: 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64   hasDistinct = d
4670: 69 73 74 69 6e 63 74 3e 3d 30 3b 0a 20 20 69 66  istinct>=0;.  if
4680: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ( pOrderBy==0 &&
4690: 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b   !hasDistinct ){
46a0: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
46b0: 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29  v, p, iContinue)
46c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  ;.  }..  /* Pull
46d0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
46e0: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  olumns..  */.  i
46f0: 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a  f( nColumn>0 ){.
4700: 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d      nResultCol =
4710: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73   nColumn;.  }els
4720: 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f  e{.    nResultCo
4730: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
4740: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65  r;.  }.  if( pDe
4750: 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20  st->iMem==0 ){. 
4760: 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d     pDest->iMem =
4770: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
4780: 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  .    pDest->nMem
4790: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
47a0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
47b0: 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20  += nResultCol;. 
47c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 73 74   }else if( pDest
47d0: 2d 3e 6e 4d 65 6d 21 3d 6e 52 65 73 75 6c 74 43  ->nMem!=nResultC
47e0: 6f 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ol ){.    /* Thi
47f0: 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  s happens when t
4800: 77 6f 20 53 45 4c 45 43 54 73 20 6f 66 20 61 20  wo SELECTs of a 
4810: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
4820: 68 61 76 65 20 64 69 66 66 65 72 69 6e 67 0a 20  have differing. 
4830: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 20 6f 66     ** numbers of
4840: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e   result columns.
4850: 20 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73    The error mess
4860: 61 67 65 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  age will be gene
4870: 72 61 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  rated by.    ** 
4880: 61 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 72  a higher-level r
4890: 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 72  outine. */.    r
48a0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 65 67  eturn;.  }.  reg
48b0: 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e  Result = pDest->
48c0: 69 4d 65 6d 3b 0a 20 20 69 66 28 20 6e 43 6f 6c  iMem;.  if( nCol
48d0: 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72  umn>0 ){.    for
48e0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
48f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
4900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4910: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
4920: 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c  Tab, i, regResul
4930: 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  t+i);.    }.  }e
4940: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
4950: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
4960: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
4970: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
4980: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
4990: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
49a0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
49b0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
49c0: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
49d0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
49e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
49f0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
4a00: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
4a10: 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f  ult, eDest==SRT_
4a20: 4f 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e  Output);.  }.  n
4a30: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74  Column = nResult
4a40: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Col;..  /* If th
4a50: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
4a60: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
4a70: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
4a80: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
4a90: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
4aa0: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
4ab0: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
4ac0: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
4ad0: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
4ae0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
4af0: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
4b00: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
4b10: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
4b20: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
4b30: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63  nColumn );.    c
4b40: 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
4b50: 73 65 2c 20 64 69 73 74 69 6e 63 74 2c 20 69 43  se, distinct, iC
4b60: 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e  ontinue, nColumn
4b70: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
4b80: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
4b90: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
4ba0: 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e  ffset(v, p, iCon
4bb0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
4bc0: 7d 0a 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f  }..  if( checkFo
4bd0: 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65  rMultiColumnSele
4be0: 63 74 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  ctError(pParse, 
4bf0: 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e  pDest, pEList->n
4c00: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 72 65 74  Expr) ){.    ret
4c10: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  urn;.  }..  swit
4c20: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
4c30: 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65   /* In this mode
4c40: 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75 65  , write each que
4c50: 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65  ry result to the
4c60: 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70   key of the temp
4c70: 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62  orary.    ** tab
4c80: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
4c90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4ca0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
4cb0: 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53 52  LECT.    case SR
4cc0: 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20  T_Union: {.     
4cd0: 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72   int r1;.      r
4ce0: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
4cf0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
4d00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
4d10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
4d20: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
4d30: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29  lt, nColumn, r1)
4d40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4d50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4d60: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
4d70: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
4d80: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
4d90: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
4da0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4db0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74   }..    /* Const
4dc0: 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72  ruct a record fr
4dd0: 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73  om the query res
4de0: 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64  ult, but instead
4df0: 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e   of.    ** savin
4e00: 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75  g that record, u
4e10: 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74  se it as a key t
4e20: 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74  o delete element
4e30: 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
4e40: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
4e50: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
4e60: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63      case SRT_Exc
4e70: 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ept: {.      sql
4e80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4e90: 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20  , OP_IdxDelete, 
4ea0: 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74  iParm, regResult
4eb0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
4ec0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4ed0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74  endif..    /* St
4ee0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  ore the result a
4ef0: 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75  s data using a u
4f00: 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a  nique key..    *
4f10: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  /.    case SRT_T
4f20: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
4f30: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
4f40: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
4f50: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
4f60: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
4f70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4f80: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
4f90: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  d, regResult, nC
4fa0: 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20  olumn, r1);.    
4fb0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
4fc0: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
4fd0: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
4fe0: 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31   pOrderBy, p, r1
4ff0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
5000: 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d          int r2 =
5010: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5020: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
5030: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5040: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
5050: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29  owid, iParm, r2)
5060: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5070: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5080: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
5090: 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
50a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
50b0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
50c0: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20  APPEND);.       
50d0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
50e0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
50f0: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
5100: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
5110: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
5120: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
5130: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
5140: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
5150: 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
5160: 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
5170: 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
5180: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
5190: 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
51a0: 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
51b0: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
51c0: 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
51d0: 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
51e0: 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
51f0: 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
5200: 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
5210: 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
5220: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
5230: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
5240: 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  umn==1 );.      
5250: 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  p->affinity = sq
5260: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
5270: 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30  nity(pEList->a[0
5280: 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e  ].pExpr, pDest->
5290: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20  affinity);.     
52a0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
52b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66  .        /* At f
52c0: 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20  irst glance you 
52d0: 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63  would think we c
52e0: 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75  ould optimize ou
52f0: 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
5300: 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69   ORDER BY in thi
5310: 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65  s case since the
5320: 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65   order of entrie
5330: 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20  s in the set.   
5340: 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74       ** does not
5350: 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68   matter.  But th
5360: 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c  ere might be a L
5370: 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20  IMIT clause, in 
5380: 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a  which.        **
5390: 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20   case the order 
53a0: 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20  does matter */. 
53b0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
53c0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
53d0: 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65  rderBy, p, regRe
53e0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  sult);.      }el
53f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
5400: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
5410: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
5420: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5430: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
5440: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
5450: 65 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20 26 70  esult, 1, r1, &p
5460: 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a  ->affinity, 1);.
5470: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5480: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
5490: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
54a0: 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20  egResult, 1);.  
54b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
54c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
54d0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
54e0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
54f0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
5500: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
5510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5520: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5530: 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
5540: 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
5550: 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
5560: 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
5570: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
5580: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
5590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
55a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
55b0: 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d  nteger, 1, iParm
55c0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
55d0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
55e0: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
55f0: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
5600: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5610: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
5620: 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
5630: 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
5640: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
5650: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
5660: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
5670: 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
5680: 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
5690: 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
56a0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
56b0: 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
56c0: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
56d0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
56e0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
56f0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5700: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
5710: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
5720: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
5730: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
5740: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5750: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5760: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
5770: 67 52 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20  gResult, iParm, 
5780: 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  1);.        /* T
5790: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
57a0: 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
57b0: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
57c0: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
57d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
57e0: 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
57f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
5800: 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
5810: 20 53 65 6e 64 20 74 68 65 20 64 61 74 61 20 74   Send the data t
5820: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  o the callback f
5830: 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20  unction or to a 
5840: 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20  subroutine.  In 
5850: 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  the.    ** case 
5860: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c  of a subroutine,
5870: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
5880: 69 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e  itself is respon
5890: 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  sible for.    **
58a0: 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74   popping the dat
58b0: 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  a from the stack
58c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
58d0: 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
58e0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75  .    case SRT_Ou
58f0: 74 70 75 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  tput: {.      if
5900: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
5910: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
5920: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5930: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
5940: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5950: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
5960: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
5970: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20   nColumn, r1);. 
5980: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
5990: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
59a0: 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a  rderBy, p, r1);.
59b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
59c0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
59d0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
59e0: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
59f0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
5a00: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
5a10: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
5a20: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
5a30: 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  >iParm);.      }
5a40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5a50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
5a60: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
5a70: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
5a80: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  umn);.        sq
5a90: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
5aa0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
5ab0: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
5ac0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
5ad0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5ae0: 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e     }..#if !defin
5af0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
5b00: 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44  RIGGER).    /* D
5b10: 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c  iscard the resul
5b20: 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ts.  This is use
5b30: 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61  d for SELECT sta
5b40: 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20  tements inside. 
5b50: 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f     ** the body o
5b60: 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68  f a TRIGGER.  Th
5b70: 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63  e purpose of suc
5b80: 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20  h selects is to 
5b90: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72  call.    ** user
5ba0: 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
5bb0: 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64  ns that have sid
5bc0: 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64  e effects.  We d
5bd0: 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a  o not care.    *
5be0: 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75  * about the actu
5bf0: 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  al results of th
5c00: 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f  e select..    */
5c10: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
5c20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
5c30: 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
5c40: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
5c50: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
5c60: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
5c70: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
5c80: 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
5c90: 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
5ca0: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
5cb0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
5cc0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 20   pOrderBy==0 ); 
5cd0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
5ce0: 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
5cf0: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20   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 2a 2a 20 70 75 73 68 4f 6e 74 6f       ** pushOnto
5d20: 53 6f 72 74 65 72 28 29 20 77 6f 75 6c 64 20 68  Sorter() would h
5d30: 61 76 65 20 63 6c 65 61 72 65 64 20 70 2d 3e 69  ave cleared p->i
5d40: 4c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 73 71 6c  Limit */.    sql
5d50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5d60: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
5d70: 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20  iLimit, -1);.   
5d80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d90: 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p2(v, OP_IfZero,
5da0: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
5db0: 61 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ak);.  }.}../*.*
5dc0: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
5dd0: 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65  ssion list, gene
5de0: 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73  rate a KeyInfo s
5df0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
5e00: 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c  cords.** the col
5e10: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
5e20: 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  for each express
5e30: 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72  ion in that expr
5e40: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
5e50: 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69  ** If the ExprLi
5e60: 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  st is an ORDER B
5e70: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
5e80: 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65  ause then the re
5e90: 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e  sulting.** KeyIn
5ea0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
5eb0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
5ec0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
5ed0: 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a  irtual index to.
5ee0: 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61  ** implement tha
5ef0: 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68  t clause.  If th
5f00: 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68  e ExprList is th
5f10: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
5f20: 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e  a SELECT.** then
5f30: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
5f40: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
5f50: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
5f60: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
5f70: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70  .** index to imp
5f80: 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43  lement a DISTINC
5f90: 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70  T test..**.** Sp
5fa0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
5fb0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
5fc0: 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d  e is obtain from
5fd0: 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61   malloc.  The ca
5fe0: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
5ff0: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
6000: 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74   for seeing that
6010: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
6020: 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
6030: 20 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65   freed.  Add the
6040: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
6050: 72 65 20 74 6f 20 74 68 65 20 50 34 20 66 69 65  re to the P4 fie
6060: 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20  ld of an opcode 
6070: 75 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49  using.** P4_KEYI
6080: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74  NFO_HANDOFF is t
6090: 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20  he usual way of 
60a0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69  dealing with thi
60b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  s..*/.static Key
60c0: 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f  Info *keyInfoFro
60d0: 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20  mExprList(Parse 
60e0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73  *pParse, ExprLis
60f0: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c  t *pList){.  sql
6100: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6110: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78  e->db;.  int nEx
6120: 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  pr;.  KeyInfo *p
6130: 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45  Info;.  struct E
6140: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
6150: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  tem;.  int i;.. 
6160: 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e   nExpr = pList->
6170: 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d  nExpr;.  pInfo =
6180: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
6190: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
61a0: 2a 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a  *pInfo) + nExpr*
61b0: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
61c0: 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49  )+1) );.  if( pI
61d0: 6e 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  nfo ){.    pInfo
61e0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
61f0: 75 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c  u8*)&pInfo->aCol
6200: 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49  l[nExpr];.    pI
6210: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45  nfo->nField = nE
6220: 78 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  xpr;.    pInfo->
6230: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
6240: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
6250: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45  m=pList->a; i<nE
6260: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
6270: 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  +){.      CollSe
6280: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
6290: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
62a0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
62b0: 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
62c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  ;.      if( !pCo
62d0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
62e0: 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
62f0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
6300: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b     pInfo->aColl[
6310: 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
6320: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
6330: 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  der[i] = pItem->
6340: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
6350: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
6360: 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  nfo;.}.../*.** I
6370: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
6380: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
6390: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
63a0: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
63b0: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
63c0: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
63d0: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
63e0: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
63f0: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
6400: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
6410: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
6420: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
6430: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
6440: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
6450: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
6460: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
6470: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
6480: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
6490: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
64a0: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
64b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
64c0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
64d0: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
64e0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
64f0: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
6500: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
6510: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
6520: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
6530: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
6540: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
6550: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
6560: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
6570: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
6580: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6590: 29 7b 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73  ){.  int brk = s
65a0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
65b0: 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f  bel(v);.  int co
65c0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
65d0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
65e0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20  int addr;.  int 
65f0: 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75  iTab;.  int pseu
6600: 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70  doTab = 0;.  Exp
6610: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
6620: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
6630: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
6640: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e  est->eDest;.  in
6650: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
6660: 3e 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72  >iParm;..  int r
6670: 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67  egRow;.  int reg
6680: 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d  Rowid;..  iTab =
6690: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
66a0: 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74  sor;.  if( eDest
66b0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
66c0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
66d0: 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65 75  tine ){.    pseu
66e0: 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  doTab = pParse->
66f0: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nTab++;.    sqli
6700: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6710: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
6720: 73 2c 20 30 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  s, 0, nColumn);.
6730: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6740: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
6750: 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61  Pseudo, pseudoTa
6760: 62 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  b, eDest==SRT_Ou
6770: 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 61 64 64  tput);.  }.  add
6780: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
6790: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
67a0: 53 6f 72 74 2c 20 69 54 61 62 2c 20 62 72 6b 29  Sort, iTab, brk)
67b0: 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76  ;.  codeOffset(v
67c0: 2c 20 70 2c 20 63 6f 6e 74 29 3b 0a 20 20 72 65  , p, cont);.  re
67d0: 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65  gRow = sqlite3Ge
67e0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
67f0: 3b 0a 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73  ;.  regRowid = s
6800: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6810: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
6820: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6830: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
6840: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
6850: 72 20 2b 20 31 2c 20 72 65 67 52 6f 77 29 3b 0a  r + 1, regRow);.
6860: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
6870: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  ){.    case SRT_
6880: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
6890: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
68a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
68b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
68c0: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
68d0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
68e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
68f0: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
6900: 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72  iParm, regRow, r
6910: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
6920: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6930: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
6940: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65  PEND);.      bre
6950: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
6960: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
6970: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
6980: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
6990: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
69a0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
69b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
69c0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
69d0: 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52   regRow, 1, regR
69e0: 6f 77 69 64 2c 20 26 70 2d 3e 61 66 66 69 6e 69  owid, &p->affini
69f0: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ty, 1);.      sq
6a00: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
6a10: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
6a20: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b  rse, regRow, 1);
6a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6a40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6a50: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
6a60: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
6a70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6a80: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
6a90: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
6aa0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
6ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6ac0: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
6ad0: 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20   regRow, iParm, 
6ae0: 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
6af0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
6b00: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
6b10: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
6b20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6b30: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
6b40: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 0a 20  se SRT_Output:. 
6b50: 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f     case SRT_Coro
6b60: 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69  utine: {.      i
6b70: 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt i;.      sqli
6b80: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6b90: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
6ba0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
6bb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6bc0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
6bd0: 20 70 73 65 75 64 6f 54 61 62 2c 20 72 65 67 52   pseudoTab, regR
6be0: 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  ow, regRowid);. 
6bf0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6c00: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
6c10: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
6c20: 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69 4d  egRow!=pDest->iM
6c30: 65 6d 2b 69 20 29 3b 0a 20 20 20 20 20 20 20 20  em+i );.        
6c40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6c50: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
6c60: 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44  pseudoTab, i, pD
6c70: 65 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20  est->iMem+i);.  
6c80: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6c90: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
6ca0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
6cb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6cc0: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
6cd0: 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f  pDest->iMem, nCo
6ce0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
6cf0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
6d00: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
6d10: 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65  arse, pDest->iMe
6d20: 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  m, nColumn);.   
6d30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6d40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6d50: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
6d60: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a   pDest->iParm);.
6d70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
6d80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
6d90: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6da0: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
6db0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6dc0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
6dd0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
6de0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b  pParse, regRow);
6df0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
6e00: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6e10: 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f   regRowid);..  /
6e20: 2a 20 4c 49 4d 49 54 20 68 61 73 20 62 65 65 6e  * LIMIT has been
6e30: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
6e40: 74 68 65 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  the pushOntoSort
6e50: 65 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20  er() routine..  
6e60: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
6e70: 69 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 0a 20 20  iLimit==0 );..  
6e80: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
6e90: 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20   the loop.  */. 
6ea0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
6eb0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74  lveLabel(v, cont
6ec0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6ed0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
6ee0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a  t, iTab, addr);.
6ef0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
6f00: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b  olveLabel(v, brk
6f10: 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  );.  if( eDest==
6f20: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
6f30: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
6f40: 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ne ){.    sqlite
6f50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6f60: 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54  P_Close, pseudoT
6f70: 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a  ab, 0);.  }..}..
6f80: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
6f90: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
6fa0: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
6fb0: 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  e 'declaration t
6fc0: 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65  ype' of the.** e
6fd0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
6fe0: 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20   The string may 
6ff0: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74  be treated as st
7000: 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c  atic by the call
7010: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  er..**.** The de
7020: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
7030: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
7040: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
7050: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
7060: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
7070: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7080: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
7090: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
70a0: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
70b0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
70c0: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
70d0: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
70e0: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
70f0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
7100: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
7110: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
7120: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
7130: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
7140: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
7150: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
7160: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
7170: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
7180: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
7190: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
71a0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
71b0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
71c0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
71d0: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
71e0: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
71f0: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
7200: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
7210: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
7220: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
7230: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
7240: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
7250: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
7260: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
7270: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
7280: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
7290: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
72a0: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
72b0: 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  ype(.  NameConte
72c0: 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72  xt *pNC, .  Expr
72d0: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
72e0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
72f0: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
7300: 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a   **pzOriginTab,.
7310: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
7320: 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20  zOriginCol.){.  
7330: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
7340: 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
7350: 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d  nst *zOriginDb =
7360: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
7370: 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30   *zOriginTab = 0
7380: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
7390: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a  zOriginCol = 0;.
73a0: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70    int j;.  if( p
73b0: 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e  Expr==0 || pNC->
73c0: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65  pSrcList==0 ) re
73d0: 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63  turn 0;..  switc
73e0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
73f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
7400: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
7410: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
7420: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
7430: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
7440: 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  n. Locate the ta
7450: 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ble the column i
7460: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
7470: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
7480: 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70  in NameContext.p
7490: 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61  SrcList. This ta
74a0: 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a  ble may be real.
74b0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
74c0: 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62  e table or a sub
74d0: 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  query..      */.
74e0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
74f0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
7500: 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63    /* Table struc
7510: 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65  ture column is e
7520: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
7530: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
7540: 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  S = 0;          
7550: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65     /* Select the
7560: 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61   column is extra
7570: 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  cted from */.   
7580: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45     int iCol = pE
7590: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f  xpr->iColumn;  /
75a0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
75b0: 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20  n in pTab */.   
75c0: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26     while( pNC &&
75d0: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20   !pTab ){.      
75e0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
75f0: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
7600: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
7610: 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d  (j=0;j<pTabList-
7620: 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69 73  >nSrc && pTabLis
7630: 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21  t->a[j].iCursor!
7640: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a  =pExpr->iTable;j
7650: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ++);.        if(
7660: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
7670: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
7680: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
7690: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
76a0: 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69       pS = pTabLi
76b0: 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74  st->a[j].pSelect
76c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
76d0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d  .          pNC =
76e0: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
76f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
7700: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
7710: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
7720: 46 49 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20  FIX ME:.        
7730: 2a 2a 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75  ** This can occu
7740: 72 73 20 69 66 20 79 6f 75 20 68 61 76 65 20 73  rs if you have s
7750: 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53  omething like "S
7760: 45 4c 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e  ELECT new.x;" in
7770: 73 69 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  side.        ** 
7780: 61 20 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f  a trigger.  In o
7790: 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79  ther words, if y
77a0: 6f 75 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ou reference the
77b0: 20 73 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20   special "new". 
77c0: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
77d0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
77e0: 74 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  t of a select.  
77f0: 57 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  We do not have a
7800: 20 67 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20   good way.      
7810: 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65    ** to find the
7820: 20 61 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79   actual table ty
7830: 70 65 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22  pe, so call it "
7840: 54 45 58 54 22 2e 20 20 54 68 69 73 20 69 73 20  TEXT".  This is 
7850: 72 65 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a  really.        *
7860: 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61  * something of a
7870: 20 62 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e   bug, but I do n
7880: 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66  ot know how to f
7890: 69 78 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a  ix it..        *
78a0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
78b0: 73 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20  s code does not 
78c0: 70 72 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72  produce the corr
78d0: 65 63 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20  ect answer - it 
78e0: 6a 75 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20  just prevents.  
78f0: 20 20 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61        ** a segfa
7900: 75 6c 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74  ult.  See ticket
7910: 20 23 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20   #1229..        
7920: 2a 2f 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65  */.        zType
7930: 20 3d 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20   = "TEXT";.     
7940: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7950: 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
7960: 20 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69   pTab );.      i
7970: 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20  f( pS ){.       
7980: 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20   /* The "table" 
7990: 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75  is actually a su
79a0: 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69  b-select or a vi
79b0: 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ew in the FROM c
79c0: 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
79d0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
79e0: 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e  tatement. Return
79f0: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
7a00: 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e   type and origin
7a10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
7a20: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d   for the result-
7a30: 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  set column of th
7a40: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20  e sub-select..  
7a50: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
7a60: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
7a70: 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d  iCol<pS->pEList-
7a80: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
7a90: 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69      /* If iCol i
7aa0: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
7ab0: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
7ac0: 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74  ssion requests t
7ad0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
7ae0: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62  rowid of the sub
7af0: 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
7b00: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
7b10: 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a   is legal (see .
7b20: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73            ** tes
7b30: 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32  t case misc2.2.2
7b40: 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76  ) - it always ev
7b50: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e  aluates to NULL.
7b60: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
7b70: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
7b80: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20  ext sNC;.       
7b90: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
7ba0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
7bb0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
7bc0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
7bd0: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
7be0: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
7bf0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e   0;.          sN
7c00: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
7c10: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
7c20: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
7c30: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
7c40: 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67  OriginDb, &zOrig
7c50: 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43  inTab, &zOriginC
7c60: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ol); .        }.
7c70: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7c80: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
7c90: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65  .        /* A re
7ca0: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  al table */.    
7cb0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20      assert( !pS 
7cc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
7cd0: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
7ce0: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
7cf0: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
7d00: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
7d10: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
7d20: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20  Col) );.        
7d30: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
7d40: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
7d50: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
7d60: 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20       zOriginCol 
7d70: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
7d80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7d90: 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62      zType = pTab
7da0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79  ->aCol[iCol].zTy
7db0: 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  pe;.          zO
7dc0: 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d  riginCol = pTab-
7dd0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
7de0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
7df0: 20 20 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20       zOriginTab 
7e00: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
7e10: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e         if( pNC->
7e20: 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20  pParse ){.      
7e30: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
7e40: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
7e50: 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  ex(pNC->pParse->
7e60: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
7e70: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  a);.          zO
7e80: 72 69 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70  riginDb = pNC->p
7e90: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
7ea0: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  Db].zName;.     
7eb0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7ec0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7ed0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7ee0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
7ef0: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
7f00: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
7f10: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
7f20: 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75  sub-select. Retu
7f30: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
7f40: 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20  on type and.    
7f50: 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f    ** origin info
7f60: 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20   for the single 
7f70: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
7f80: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
7f90: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20  SELECT.      ** 
7fa0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
7fb0: 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f   */.      NameCo
7fc0: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
7fd0: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45   Select *pS = pE
7fe0: 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  xpr->pSelect;.  
7ff0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
8000: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
8010: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 4e 43 2e  Expr;.      sNC.
8020: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
8030: 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  Src;.      sNC.p
8040: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
8050: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
8060: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
8070: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
8080: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
8090: 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67  OriginDb, &zOrig
80a0: 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43  inTab, &zOriginC
80b0: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  ol); .      brea
80c0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
80d0: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f    }.  .  if( pzO
80e0: 72 69 67 69 6e 44 62 20 29 7b 0a 20 20 20 20 61  riginDb ){.    a
80f0: 73 73 65 72 74 28 20 70 7a 4f 72 69 67 69 6e 54  ssert( pzOriginT
8100: 61 62 20 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f  ab && pzOriginCo
8110: 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  l );.    *pzOrig
8120: 69 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62  inDb = zOriginDb
8130: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54  ;.    *pzOriginT
8140: 61 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b  ab = zOriginTab;
8150: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f  .    *pzOriginCo
8160: 6c 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a  l = zOriginCol;.
8170: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 79    }.  return zTy
8180: 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  pe;.}../*.** Gen
8190: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
81a0: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
81b0: 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  BE the declarati
81c0: 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75  on types of colu
81d0: 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65  mns.** in the re
81e0: 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  sult set..*/.sta
81f0: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
8200: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20  eColumnTypes(.  
8210: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8220: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
8230: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
8240: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
8250: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
8260: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8270: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
8280: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
8290: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
82a0: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
82b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
82c0: 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  YPE.  Vdbe *v = 
82d0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
82e0: 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f   int i;.  NameCo
82f0: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43  ntext sNC;.  sNC
8300: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
8310: 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72  List;.  sNC.pPar
8320: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66  se = pParse;.  f
8330: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
8340: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
8350: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
8360: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
8370: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
8380: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
8390: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
83a0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
83b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
83c0: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
83d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
83e0: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
83f0: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
8400: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
8410: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
8420: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
8430: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
8440: 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  gCol);..    /* T
8450: 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b  he vdbe must mak
8460: 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f  e its own copy o
8470: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70  f the column-typ
8480: 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20  e and other .   
8490: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69   ** column speci
84a0: 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20  fic strings, in 
84b0: 63 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  case the schema 
84c0: 69 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20  is reset before 
84d0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74  this.    ** virt
84e0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64  ual machine is d
84f0: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
8500: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
8510: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
8520: 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c  OLNAME_DATABASE,
8530: 20 7a 4f 72 69 67 44 62 2c 20 50 34 5f 54 52 41   zOrigDb, P4_TRA
8540: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
8550: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8560: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8570: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
8580: 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 29 3b  , P4_TRANSIENT);
8590: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
85a0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
85b0: 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c   COLNAME_COLUMN,
85c0: 20 7a 4f 72 69 67 43 6f 6c 2c 20 50 34 5f 54 52   zOrigCol, P4_TR
85d0: 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a  ANSIENT);.#else.
85e0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
85f0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
8600: 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 0, 0);.#endif
8610: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8620: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8630: 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50   COLNAME_DECLTYP
8640: 45 2c 20 7a 54 79 70 65 2c 20 50 34 5f 54 52 41  E, zType, P4_TRA
8650: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
8660: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
8670: 49 54 5f 44 45 43 4c 54 59 50 45 20 2a 2f 0a 7d  IT_DECLTYPE */.}
8680: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
8690: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
86a0: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
86b0: 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d  e names of colum
86c0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
86d0: 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69  ult set.  This i
86e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
86f0: 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ed to provide th
8700: 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c  e.** azCol[] val
8710: 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62  ues in the callb
8720: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
8730: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
8740: 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65  mnNames(.  Parse
8750: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
8760: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
8770: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
8780: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
8790: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
87a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
87b0: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
87c0: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
87d0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
87e0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
87f0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
8800: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74  nt i, j;.  sqlit
8810: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8820: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
8830: 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73  ames, shortNames
8840: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
8850: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
8860: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
8870: 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20  n EXPLAIN, skip 
8880: 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69  this step */.  i
8890: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
88a0: 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  in ){.    return
88b0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
88c0: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
88d0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
88e0: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d  lNamesSet || v==
88f0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
8900: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
8910: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
8920: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
8930: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
8940: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
8950: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
8960: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
8970: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
8980: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
8990: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
89a0: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
89b0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
89c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
89d0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
89e0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
89f0: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
8a00: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
8a10: 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  f( p==0 ) contin
8a20: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69  ue;.    if( pELi
8a30: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29  st->a[i].zName )
8a40: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
8a50: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
8a60: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
8a70: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8a80: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8a90: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
8aa0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 29 3b   strlen(zName));
8ab0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
8ac0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
8ad0: 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20  && pTabList ){. 
8ae0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
8af0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  ;.      char *zC
8b00: 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  ol;.      int iC
8b10: 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b  ol = p->iColumn;
8b20: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
8b30: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
8b40: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
8b50: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 2d 3e 69  j].iCursor!=p->i
8b60: 54 61 62 6c 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  Table; j++){}.  
8b70: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54      assert( j<pT
8b80: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
8b90: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
8ba0: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
8bb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
8bc0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
8bd0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
8be0: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
8bf0: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
8c00: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
8c10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
8c20: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
8c30: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
8c40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8c50: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
8c60: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
8c70: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
8c80: 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73   if( !shortNames
8c90: 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29   && !fullNames )
8ca0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8cb0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
8cc0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
8cd0: 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70  ME, (char*)p->sp
8ce0: 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29  an.z, p->span.n)
8cf0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
8d00: 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28  ( fullNames || (
8d10: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70  !shortNames && p
8d20: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29  TabList->nSrc>1)
8d30: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
8d40: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
8d50: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b       char *zTab;
8d60: 0a 20 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20  . .        zTab 
8d70: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
8d80: 2e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  .zAlias;.       
8d90: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c   if( fullNames |
8da0: 7c 20 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62  | zTab==0 ) zTab
8db0: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
8dc0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8dd0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
8de0: 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
8df0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
8e00: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8e10: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8e20: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
8e30: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
8e40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8e50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
8e60: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
8e70: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
8e80: 6f 6c 2c 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29  ol, strlen(zCol)
8e90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8ea0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
8eb0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
8ec0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
8ed0: 4e 41 4d 45 2c 20 28 63 68 61 72 2a 29 70 2d 3e  NAME, (char*)p->
8ee0: 73 70 61 6e 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e  span.z, p->span.
8ef0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  n);.    }.  }.  
8f00: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
8f10: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
8f20: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
8f30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8f40: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
8f50: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  ELECT./*.** Name
8f60: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
8f70: 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65  on operator, use
8f80: 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  d for error mess
8f90: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
8fa0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65  const char *sele
8fb0: 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29  ctOpName(int id)
8fc0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  {.  char *z;.  s
8fd0: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
8fe0: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20   case TK_ALL:   
8ff0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41      z = "UNION A
9000: 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  LL";   break;.  
9010: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
9020: 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53  ECT: z = "INTERS
9030: 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ECT";   break;. 
9040: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
9050: 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50  T:    z = "EXCEP
9060: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
9070: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
9080: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
9090: 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  N";       break;
90a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b  .  }.  return z;
90b0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
90c0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
90d0: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
90e0: 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20 65 78  ** Given a an ex
90f0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77  pression list (w
9100: 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74  hich is really t
9110: 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65  he list of expre
9120: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66  ssions.** that f
9130: 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73  orm the result s
9140: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  et of a SELECT s
9150: 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74  tatement) comput
9160: 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
9170: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
9180: 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77  r a table that w
9190: 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78  ould hold the ex
91a0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
91b0: 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20  *.** All column 
91c0: 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e  names will be un
91d0: 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ique..**.** Only
91e0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
91f0: 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20  s are computed. 
9200: 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43   Column.zType, C
9210: 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20  olumn.zColl,.** 
9220: 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
9230: 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a   of Column are z
9240: 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  eroed..**.** Ret
9250: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
9260: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20   success.  If a 
9270: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
9280: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
9290: 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e  ** store NULL in
92a0: 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e   *paCol and 0 in
92b0: 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75   *pnCol and retu
92c0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
92d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
92e0: 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d  electColumnsFrom
92f0: 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
9300: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
9310: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9320: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
9330: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
9340: 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74      /* Expr list
9350: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64   from which to d
9360: 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  erive column nam
9370: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43  es */.  int *pnC
9380: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
9390: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
93a0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68  ber of columns h
93b0: 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  ere */.  Column 
93c0: 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20  **paCol         
93d0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65   /* Write the ne
93e0: 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65  w column list he
93f0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  re */.){.  sqlit
9400: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9410: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  >db;.  int i, j,
9420: 20 63 6e 74 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   cnt;.  Column *
9430: 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 0a 20 20 69  aCol, *pCol;.  i
9440: 6e 74 20 6e 43 6f 6c 3b 0a 20 20 45 78 70 72 20  nt nCol;.  Expr 
9450: 2a 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  *p;.  char *zNam
9460: 65 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  e;.  int nName;.
9470: 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  .  *pnCol = nCol
9480: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
9490: 3b 0a 20 20 61 43 6f 6c 20 3d 20 2a 70 61 43 6f  ;.  aCol = *paCo
94a0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  l = sqlite3DbMal
94b0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
94c0: 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c  of(aCol[0])*nCol
94d0: 29 3b 0a 20 20 69 66 28 20 61 43 6f 6c 3d 3d 30  );.  if( aCol==0
94e0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
94f0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 66 6f 72 28 69 3d  _NOMEM;.  for(i=
9500: 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c  0, pCol=aCol; i<
9510: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
9520: 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61  +){.    /* Get a
9530: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
9540: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
9550: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  n.    */.    p =
9560: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
9570: 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
9580: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c   p->pRight==0 ||
9590: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
95a0: 6e 2e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  n.z==0 || p->pRi
95b0: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21  ght->token.z[0]!
95c0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 7a  =0 );.    if( (z
95d0: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
95e0: 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  [i].zName)!=0 ){
95f0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
9600: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73   column contains
9610: 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20   an "AS <name>" 
9620: 70 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d  phrase, use <nam
9630: 65 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a  e> as the name *
9640: 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  /.      zName = 
9650: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
9660: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
9670: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
9680: 72 20 2a 70 43 6f 6c 20 3d 20 70 3b 0a 20 20 20  r *pCol = p;.   
9690: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
96a0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f        while( pCo
96b0: 6c 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 20  l->op==TK_DOT ) 
96c0: 70 43 6f 6c 20 3d 20 70 43 6f 6c 2d 3e 70 52 69  pCol = pCol->pRi
96d0: 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ght;.      if( p
96e0: 43 6f 6c 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  Col->op==TK_COLU
96f0: 4d 4e 20 26 26 20 28 70 54 61 62 20 3d 20 70 43  MN && (pTab = pC
9700: 6f 6c 2d 3e 70 54 61 62 29 21 3d 30 20 29 7b 0a  ol->pTab)!=0 ){.
9710: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63          /* For c
9720: 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63  olumns use the c
9730: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20  olumn name name 
9740: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
9750: 43 6f 6c 20 3d 20 70 43 6f 6c 2d 3e 69 43 6f 6c  Col = pCol->iCol
9760: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  umn;.        if(
9770: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
9780: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
9790: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
97a0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
97b0: 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
97c0: 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20          iCol>=0 
97d0: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
97e0: 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
97f0: 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  d");.      }else
9800: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  {.        /* Use
9810: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
9820: 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  xt of the column
9830: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69   expression as i
9840: 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  ts name */.     
9850: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
9860: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
9870: 54 22 2c 20 26 70 43 6f 6c 2d 3e 73 70 61 6e 29  T", &pCol->span)
9880: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9890: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
98a0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
98b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
98c0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
98d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
98e0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
98f0: 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f  e(zName);..    /
9900: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
9910: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75  column name is u
9920: 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e  nique.  If the n
9930: 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  ame is not uniqu
9940: 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64  e,.    ** append
9950: 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68   a integer to th
9960: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69  e name so that i
9970: 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65  t becomes unique
9980: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61  ..    */.    nNa
9990: 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d  me = strlen(zNam
99a0: 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e  e);.    for(j=cn
99b0: 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a  t=0; j<i; j++){.
99c0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
99d0: 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d  3StrICmp(aCol[j]
99e0: 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
99f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
9a00: 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20  r *zNewName;.   
9a10: 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65       zName[nName
9a20: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  ] = 0;.        z
9a30: 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  NewName = sqlite
9a40: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
9a50: 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  :%d", zName, ++c
9a60: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
9a70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
9a80: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a  Name);.        z
9a90: 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b  Name = zNewName;
9aa0: 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b  .        j = -1;
9ab0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61  .        if( zNa
9ac0: 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  me==0 ) break;. 
9ad0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9ae0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
9af0: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Name;.  }.  if( 
9b00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9b10: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20   ){.    int j;. 
9b20: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b     for(j=0; j<i;
9b30: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   j++){.      sql
9b40: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
9b50: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[j].zName);. 
9b60: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9b70: 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29  DbFree(db, aCol)
9b80: 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30  ;.    *paCol = 0
9b90: 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30  ;.    *pnCol = 0
9ba0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
9bb0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
9bc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9bd0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
9be0: 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
9bf0: 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  on information t
9c00: 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  o a column list 
9c10: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45  based on.** a SE
9c20: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
9c30: 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ** .** The colum
9c40: 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c  n list presumabl
9c50: 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65  y came from sele
9c60: 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f  ctColumnNamesFro
9c70: 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20  mExprList()..** 
9c80: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
9c90: 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20  has only names, 
9ca0: 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c  not types or col
9cb0: 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a  lations.  This.*
9cc0: 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  * routine goes t
9cd0: 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20  hrough and adds 
9ce0: 74 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f  the types and co
9cf0: 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  llations..**.** 
9d00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71  This routine req
9d10: 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69  uires that all i
9d20: 6e 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74  ndentifiers in t
9d30: 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61  he SELECT.** sta
9d40: 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76  tement be resolv
9d50: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
9d60: 69 64 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75  id selectAddColu
9d70: 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
9d80: 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  on(.  Parse *pPa
9d90: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
9da0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20  arsing contexts 
9db0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 20  */.  int nCol,  
9dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9dd0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
9de0: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
9df0: 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  l,         /* Li
9e00: 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f  st of columns */
9e10: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
9e20: 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
9e30: 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
9e40: 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
9e50: 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
9e60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9e70: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
9e80: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
9e90: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9ea0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
9eb0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
9ec0: 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
9ed0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
9ee0: 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
9ef0: 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ct!=0 );.  asser
9f00: 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c  t( (pSelect->sel
9f10: 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
9f20: 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  ved)!=0 );.  ass
9f30: 65 72 74 28 20 6e 43 6f 6c 3d 3d 70 53 65 6c 65  ert( nCol==pSele
9f40: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
9f50: 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
9f60: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64  ailed );.  if( d
9f70: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9f80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73  ) return;.  mems
9f90: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
9fa0: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e  of(sNC));.  sNC.
9fb0: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65  pSrcList = pSele
9fc0: 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20  ct->pSrc;.  a = 
9fd0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
9fe0: 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  >a;.  for(i=0, p
9ff0: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c  Col=aCol; i<nCol
a000: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
a010: 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78      p = a[i].pEx
a020: 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54  pr;.    pCol->zT
a030: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ype = sqlite3DbS
a040: 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d 6e  trDup(db, column
a050: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
a060: 20 30 2c 20 30 29 29 3b 0a 20 20 20 20 70 43 6f   0, 0));.    pCo
a070: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
a080: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
a090: 79 28 70 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  y(p);.    pColl 
a0a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
a0b0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
a0c0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
a0d0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43  {.      pCol->zC
a0e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  oll = sqlite3DbS
a0f0: 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d  trDup(db, pColl-
a100: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
a110: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
a120: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
a130: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
a140: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
a150: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
a160: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
a170: 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
a180: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
a190: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
a1a0: 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
a1b0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
a1c0: 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
a1d0: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
a1e0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a1f0: 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67  .  int savedFlag
a200: 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73  s;..  savedFlags
a210: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
a220: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
a230: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
a240: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  s;.  db->flags |
a250: 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
a260: 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65  lNames;.  sqlite
a270: 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
a280: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b  se, pSelect, 0);
a290: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
a2a0: 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
a2b0: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
a2c0: 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
a2d0: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
a2e0: 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  rior;.  db->flag
a2f0: 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  s = savedFlags;.
a300: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
a310: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
a320: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
a330: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
a340: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
a350: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 64 62 20  .  }.  pTab->db 
a360: 3d 20 64 62 3b 0a 20 20 70 54 61 62 2d 3e 6e 52  = db;.  pTab->nR
a370: 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e  ef = 1;.  pTab->
a380: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 73 65 6c  zName = 0;.  sel
a390: 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
a3a0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
a3b0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
a3c0: 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
a3d0: 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c  ab->aCol);.  sel
a3e0: 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
a3f0: 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
a400: 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c  rse, pTab->nCol,
a410: 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65   pTab->aCol, pSe
a420: 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69  lect);.  pTab->i
a430: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28  PKey = -1;.  if(
a440: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a450: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
a460: 44 65 6c 65 74 65 54 61 62 6c 65 28 70 54 61 62  DeleteTable(pTab
a470: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
a480: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
a490: 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ab;.}../*.** Get
a4a0: 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65 20   a VDBE for the 
a4b0: 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e  given parser con
a4c0: 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61 20  text.  Create a 
a4d0: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
a4e0: 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  sary..** If an e
a4f0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
a500: 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61  urn NULL and lea
a510: 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  ve a message in 
a520: 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20  pParse..*/.Vdbe 
a530: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
a540: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
a550: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a560: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
a570: 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d   v==0 ){.    v =
a580: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
a590: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
a5a0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  te(pParse->db);.
a5b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a5c0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66  MIT_TRACE.    if
a5d0: 28 20 76 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ( v ){.      sql
a5e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
a5f0: 2c 20 4f 50 5f 54 72 61 63 65 29 3b 0a 20 20 20  , OP_Trace);.   
a600: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
a610: 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a  return v;.}.../*
a620: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
a630: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
a640: 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  et fields of the
a650: 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e   SELECT based on
a660: 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61   the.** pLimit a
a670: 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65  nd pOffset expre
a680: 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20  ssions.  pLimit 
a690: 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64  and pOffset hold
a6a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
a6b0: 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20  .** that appear 
a6c0: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
a6d0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66  SQL statement af
a6e0: 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ter the LIMIT an
a6f0: 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77  d OFFSET.** keyw
a700: 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69  ords.  Or NULL i
a710: 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73  f those keywords
a720: 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c   are omitted. iL
a730: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
a740: 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74   .** are the int
a750: 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69  eger memory regi
a760: 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72  ster numbers for
a770: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74   counters used t
a780: 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68  o compute .** th
a790: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
a7a0: 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  et.  If there is
a7b0: 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72   no limit and/or
a7c0: 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a   offset, then .*
a7d0: 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  * iLimit and iOf
a7e0: 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76  fset are negativ
a7f0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
a800: 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68  utine changes th
a810: 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d  e values of iLim
a820: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f  it and iOffset o
a830: 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69  nly if.** a limi
a840: 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64  t or offset is d
a850: 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74  efined by pLimit
a860: 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69   and pOffset.  i
a870: 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66  Limit and.** iOf
a880: 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65  fset should have
a890: 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20   been preset to 
a8a0: 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61  appropriate defa
a8b0: 75 6c 74 20 76 61 6c 75 65 73 0a 2a 2a 20 28 75  ult values.** (u
a8c0: 73 75 61 6c 6c 79 20 62 75 74 20 6e 6f 74 20 61  sually but not a
a8d0: 6c 77 61 79 73 20 2d 31 29 20 70 72 69 6f 72 20  lways -1) prior 
a8e0: 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
a8f0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79  routine..** Only
a900: 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72   if pLimit!=0 or
a910: 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74   pOffset!=0 do t
a920: 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
a930: 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69  rs get.** redefi
a940: 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20  ned.  The UNION 
a950: 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65  ALL operator use
a960: 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20  s this property 
a970: 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20  to force.** the 
a980: 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d  reuse of the sam
a990: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
a9a0: 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72  et registers acr
a9b0: 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  oss multiple.** 
a9c0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
a9d0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
a9e0: 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65  d computeLimitRe
a9f0: 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70  gisters(Parse *p
aa00: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
aa10: 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20  , int iBreak){. 
aa20: 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20   Vdbe *v = 0;.  
aa30: 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  int iLimit = 0;.
aa40: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
aa50: 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 69 66   int addr1;.  if
aa60: 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65  ( p->iLimit ) re
aa70: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  turn;..  /* .  *
aa80: 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77  * "LIMIT -1" alw
aa90: 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f  ays shows all ro
aaa0: 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f  ws.  There is so
aab0: 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65  me.  ** contrave
aac0: 72 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74  rsy about what t
aad0: 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
aae0: 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20  ior should be.. 
aaf0: 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   ** The current 
ab00: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
ab10: 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54  nterprets "LIMIT
ab20: 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a   0" to mean.  **
ab30: 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20   no rows..  */. 
ab40: 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
ab50: 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  {.    p->iLimit 
ab60: 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61  = iLimit = ++pPa
ab70: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76  rse->nMem;.    v
ab80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
ab90: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
aba0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
abb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
abc0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
abd0: 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29  >pLimit, iLimit)
abe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
abf0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
ac00: 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29  stBeInt, iLimit)
ac10: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
ac20: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
ac30: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 73 71 6c  nter"));.    sql
ac40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ac50: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69  , OP_IfZero, iLi
ac60: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
ac70: 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73  }.  if( p->pOffs
ac80: 65 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4f 66  et ){.    p->iOf
ac90: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
aca0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
acb0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d  .    if( p->pLim
acc0: 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
acd0: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a  se->nMem++;   /*
ace0: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74   Allocate an ext
acf0: 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ra register for 
ad00: 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a  limit+offset */.
ad10: 20 20 20 20 7d 0a 20 20 20 20 76 20 3d 20 73 71      }.    v = sq
ad20: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
ad30: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
ad40: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
ad50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ad60: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
ad70: 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  set, iOffset);. 
ad80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ad90: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
ada0: 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a  eInt, iOffset);.
adb0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
adc0: 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e  (v, "OFFSET coun
add0: 74 65 72 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ter"));.    addr
ade0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
adf0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
ae00: 73 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  s, iOffset);.   
ae10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ae20: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
ae30: 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  , 0, iOffset);. 
ae40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
ae50: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
ae60: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69  ;.    if( p->pLi
ae70: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  mit ){.      sql
ae80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
ae90: 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74  , OP_Add, iLimit
aea0: 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  , iOffset, iOffs
aeb0: 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62  et+1);.      Vdb
aec0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
aed0: 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20  MIT+OFFSET"));. 
aee0: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
aef0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
af00: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d  , OP_IfPos, iLim
af10: 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  it);.      sqlit
af20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
af30: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20  OP_Integer, -1, 
af40: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
af50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
af60: 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
af70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
af80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
af90: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
afa0: 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
afb0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
afc0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
afd0: 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
afe0: 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
aff0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
b000: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
b010: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
b020: 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
b030: 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
b040: 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
b050: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
b060: 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
b070: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
b080: 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
b090: 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
b0a0: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
b0b0: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
b0c0: 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
b0d0: 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
b0e0: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
b0f0: 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
b100: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
b110: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
b120: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
b130: 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
b140: 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
b150: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
b160: 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
b170: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
b180: 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
b190: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b1a0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
b1b0: 69 66 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20  if( pRet==0 ){. 
b1c0: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
b1d0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
b1e0: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
b1f0: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a  a[iCol].pExpr);.
b200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
b210: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
b220: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
b230: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f  UND_SELECT */../
b240: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
b250: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
b260: 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
b270: 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
b280: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
b290: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b2a0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b2c0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
b2d0: 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
b2e0: 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
b2f0: 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
b300: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
b310: 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
b320: 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66   */.);...#ifndef
b330: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
b340: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
b350: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b360: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
b370: 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  cess a compound 
b380: 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a  query form from.
b390: 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  ** two or more s
b3a0: 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20  eparate queries 
b3b0: 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49  using UNION, UNI
b3c0: 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20  ON ALL, EXCEPT, 
b3d0: 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a  or.** INTERSECT.
b3e0: 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
b3f0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
b400: 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
b410: 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
b420: 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
b430: 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
b440: 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
b450: 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
b460: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
b470: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
b480: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
b490: 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
b4a0: 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
b4b0: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
b4c0: 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
b4d0: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
b4e0: 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
b4f0: 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
b500: 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
b510: 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
b520: 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
b530: 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
b540: 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
b550: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
b560: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
b570: 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
b580: 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
b590: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
b5a0: 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
b5b0: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
b5c0: 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
b5d0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
b5e0: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
b5f0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
b600: 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
b610: 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
b620: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
b630: 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
b640: 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
b650: 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
b660: 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
b670: 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
b680: 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
b690: 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
b6a0: 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
b6b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
b6c0: 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
b6d0: 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
b6e0: 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
b6f0: 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
b700: 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
b710: 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
b720: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
b730: 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
b740: 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
b750: 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
b760: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
b770: 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
b780: 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
b790: 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
b7a0: 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
b7b0: 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
b7c0: 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
b7d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
b7e0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
b7f0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
b800: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
b810: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
b820: 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
b830: 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
b840: 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
b850: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
b860: 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
b870: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
b880: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
b890: 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
b8a0: 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
b8b0: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
b8c0: 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
b8d0: 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
b8e0: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
b8f0: 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
b900: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
b910: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
b920: 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
b930: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
b940: 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c  dest;      /* Al
b950: 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64  ternative data d
b960: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
b970: 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20  Select *pDelete 
b980: 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f  = 0;  /* Chain o
b990: 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73  f simple selects
b9a0: 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
b9b0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
b9c0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
b9d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
b9e0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
b9f0: 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
ba00: 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c  R BY or LIMIT cl
ba10: 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45  ause on prior SE
ba20: 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a  LECTs.  Only.  *
ba30: 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68  * the last (righ
ba40: 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69  t-most) SELECT i
ba50: 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79  n the series may
ba60: 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
ba70: 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f  Y or LIMIT..  */
ba80: 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20  .  assert( p && 
ba90: 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a  p->pPrior );  /*
baa0: 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   Calling functio
bab0: 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69  n guarantees thi
bac0: 73 20 6d 75 63 68 20 2a 2f 0a 20 20 64 62 20 3d  s much */.  db =
bad0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
bae0: 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
baf0: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  r;.  assert( pPr
bb00: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21  ior->pRightmost!
bb10: 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73  =pPrior );.  ass
bb20: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
bb30: 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67  ghtmost==p->pRig
bb40: 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73 74  htmost );.  dest
bb50: 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28   = *pDest;.  if(
bb60: 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
bb70: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
bb80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
bb90: 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
bba0: 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
bbb0: 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
bbc0: 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
bbd0: 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
bbe0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
bbf0: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
bc00: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
bc10: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
bc20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
bc30: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
bc40: 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
bc50: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
bc60: 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
bc70: 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
bc80: 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
bc90: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
bca0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
bcb0: 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74    }..  v = sqlit
bcc0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
bcd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
bce0: 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  0 );  /* The VDB
bcf0: 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  E already create
bd00: 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e  d by calling fun
bd10: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ction */..  /* C
bd20: 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
bd30: 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
bd40: 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
bd50: 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  ry.  */.  if( de
bd60: 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  st.eDest==SRT_Ep
bd70: 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73  hemTab ){.    as
bd80: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
bd90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
bda0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
bdb0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65  penEphemeral, de
bdc0: 73 74 2e 69 50 61 72 6d 2c 20 70 2d 3e 70 45 4c  st.iParm, p->pEL
bdd0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
bde0: 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
bdf0: 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
be00: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  /* Make sure all
be10: 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20   SELECTs in the 
be20: 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74  statement have t
be30: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
be40: 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20  f elements.  ** 
be50: 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20  in their result 
be60: 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sets..  */.  ass
be70: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26  ert( p->pEList &
be80: 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74  & pPrior->pEList
be90: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c   );.  if( p->pEL
bea0: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69  ist->nExpr!=pPri
beb0: 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
bec0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
bed0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
bee0: 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
bef0: 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
bf00: 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
bf10: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
bf20: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
bf30: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
bf40: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
bf50: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
bf60: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
bf70: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
bf80: 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53  .  /* Compound S
bf90: 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65  ELECTs that have
bfa0: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
bfb0: 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  use are handled 
bfc0: 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f  separately..  */
bfd0: 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
bfe0: 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
bff0: 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
c000: 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  rBy(pParse, p, p
c010: 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Dest);.  }..  /*
c020: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
c030: 6f 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  or the left and 
c040: 72 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61  right SELECT sta
c050: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
c060: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
c070: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c  .    case TK_ALL
c080: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
c090: 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  dr = 0;.      as
c0a0: 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
c0b0: 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
c0c0: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20  Prior->pLimit = 
c0d0: 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
c0e0: 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74   pPrior->pOffset
c0f0: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
c100: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c110: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
c120: 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a  pPrior, &dest);.
c130: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
c140: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  = 0;.      p->pO
c150: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
c160: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
c170: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
c180: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
c190: 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  }.      p->pPrio
c1a0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  r = 0;.      p->
c1b0: 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d  iLimit = pPrior-
c1c0: 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >iLimit;.      p
c1d0: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69  ->iOffset = pPri
c1e0: 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  or->iOffset;.   
c1f0: 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
c200: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72   ){.        addr
c210: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c220: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp1(v, OP_IfZer
c230: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20  o, p->iLimit);. 
c240: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
c250: 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65  nt((v, "Jump ahe
c260: 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63  ad if LIMIT reac
c270: 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  hed"));.      }.
c280: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c290: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
c2a0: 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
c2b0: 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
c2c0: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
c2d0: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
c2e0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
c2f0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
c300: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
c310: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c320: 28 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20  ( addr ){.      
c330: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
c340: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
c350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
c360: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
c370: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20  ase TK_EXCEPT:. 
c380: 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
c390: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e  : {.      int un
c3a0: 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75  ionTab;    /* Cu
c3b0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
c3c0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
c3d0: 6c 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  le holding resul
c3e0: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f  t */.      int o
c3f0: 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4f  p = 0;      /* O
c400: 6e 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f  ne of the SRT_ o
c410: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70  perations to app
c420: 6c 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20  ly to self */.  
c430: 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b      int priorOp;
c440: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f       /* The SRT_
c450: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70   operation to ap
c460: 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c  ply to prior sel
c470: 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  ects */.      Ex
c480: 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
c490: 66 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76  fset; /* Saved v
c4a0: 61 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d  alues of p->nLim
c4b0: 69 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65  it and p->nOffse
c4c0: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  t */.      int a
c4d0: 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  ddr;.      Selec
c4e0: 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b  tDest uniondest;
c4f0: 0a 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20  ..      priorOp 
c500: 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
c510: 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
c520: 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 21 70  t==priorOp && !p
c530: 2d 3e 70 4c 69 6d 69 74 20 26 26 20 21 70 2d 3e  ->pLimit && !p->
c540: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  pOffset ){.     
c550: 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
c560: 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
c570: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
c580: 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
c590: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
c5a0: 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
c5b0: 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
c5c0: 3d 20 64 65 73 74 2e 69 50 61 72 6d 3b 0a 20 20  = dest.iParm;.  
c5d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c5e0: 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65     /* We will ne
c5f0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ed to create our
c600: 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74   own temporary t
c610: 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  able to hold the
c620: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  .        ** inte
c630: 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
c640: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
c650: 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20       unionTab = 
c660: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
c670: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c680: 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
c690: 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  ;.        addr =
c6a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c6b0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
c6c0: 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62  emeral, unionTab
c6d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73  , 0);.        as
c6e0: 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
c6f0: 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
c700: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64  ;.        p->add
c710: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
c720: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ddr;.        p->
c730: 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46  pRightmost->selF
c740: 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
c750: 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
c760: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
c770: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ist );.      }..
c780: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
c790: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
c7a0: 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a  nts to our left.
c7b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
c7c0: 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
c7d0: 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20  pOrderBy );.    
c7e0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
c7f0: 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65  estInit(&unionde
c800: 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69  st, priorOp, uni
c810: 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 72 63  onTab);.      rc
c820: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
c830: 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
c840: 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
c850: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
c860: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
c870: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
c880: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
c890: 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
c8a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c8b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c8c0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  if( p->op==TK_EX
c8d0: 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  CEPT ){.        
c8e0: 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
c8f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c900: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c910: 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
c920: 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
c930: 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d  T_Union;.      }
c940: 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
c950: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
c960: 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
c970: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
c980: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
c990: 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
c9a0: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
c9b0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69  t = 0;.      uni
c9c0: 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f  ondest.eDest = o
c9d0: 70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  p;.      rc = sq
c9e0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
c9f0: 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73  se, p, &uniondes
ca00: 74 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65  t);.      /* Que
ca10: 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
ca20: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
ca30: 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
ca40: 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
ca50: 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
ca60: 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
ca70: 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
ca80: 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
ca90: 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  leak. */.      s
caa0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
cab0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
cac0: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65  erBy);.      pDe
cad0: 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
cae0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
caf0: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
cb00: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
cb10: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
cb20: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
cb30: 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
cb40: 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
cb50: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  mit;.      p->pO
cb60: 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
cb70: 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  .      p->iLimit
cb80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
cb90: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
cba0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
cbb0: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
cbc0: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
cbd0: 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   }...      /* Co
cbe0: 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
cbf0: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
cc00: 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
cc10: 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
cc20: 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
cc30: 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
cc40: 20 20 20 20 20 20 2a 2f 20 20 20 20 20 20 0a 20        */      . 
cc50: 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
cc60: 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 7c 7c 20  est!=priorOp || 
cc70: 75 6e 69 6f 6e 54 61 62 21 3d 64 65 73 74 2e 69  unionTab!=dest.i
cc80: 50 61 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Parm ){.        
cc90: 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
cca0: 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
ccb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
ccc0: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
ccd0: 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
cce0: 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
ccf0: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
cd00: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20  pFirst = p;.    
cd10: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
cd20: 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
cd30: 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
cd40: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Prior;.         
cd50: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
cd60: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
cd70: 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
cd80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cd90: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
cda0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
cdb0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f  (v);.        iCo
cdc0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
cdd0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
cde0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
cdf0: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
ce00: 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
ce10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ce20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ce30: 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62  Rewind, unionTab
ce40: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
ce50: 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
ce60: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
ce70: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  dr(v);.        s
ce80: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
ce90: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
cea0: 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70  ist, unionTab, p
ceb0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
cec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ced0: 20 20 20 20 20 20 20 20 20 30 2c 20 2d 31 2c 20           0, -1, 
cee0: 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
cef0: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
cf00: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
cf10: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
cf20: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
cf30: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
cf40: 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
cf50: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
cf60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
cf70: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
cf80: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
cf90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
cfa0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e  (v, OP_Close, un
cfb0: 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
cfc0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
cfd0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
cfe0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7b 0a  TK_INTERSECT: {.
cff0: 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20        int tab1, 
d000: 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20  tab2;.      int 
d010: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
d020: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70  Start;.      Exp
d030: 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
d040: 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  set;.      int a
d050: 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  ddr;.      Selec
d060: 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74 64  tDest intersectd
d070: 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  est;.      int r
d080: 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54  1;..      /* INT
d090: 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65 72  ERSECT is differ
d0a0: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ent from the oth
d0b0: 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65 71  ers since it req
d0c0: 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74  uires.      ** t
d0d0: 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wo temporary tab
d0e0: 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68  les.  Hence it h
d0f0: 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e  as its own case.
d100: 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a    Begin.      **
d110: 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74   by allocating t
d120: 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c  he tables we wil
d130: 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f  l need..      */
d140: 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70 50  .      tab1 = pP
d150: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
d160: 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72 73      tab2 = pPars
d170: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
d180: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
d190: 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  erBy==0 );..    
d1a0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
d1b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d1c0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
d1d0: 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
d1e0: 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
d1f0: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
d200: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64   );.      p->add
d210: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
d220: 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52  ddr;.      p->pR
d230: 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61  ightmost->selFla
d240: 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
d250: 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73  emeral;.      as
d260: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
d270: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
d280: 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f  e the SELECTs to
d290: 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74   our left into t
d2a0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
d2b0: 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  tab1"..      */.
d2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
d2d0: 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74  ectDestInit(&int
d2e0: 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f  ersectdest, SRT_
d2f0: 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20  Union, tab1);.  
d300: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d310: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
d320: 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
d330: 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  tdest);.      if
d340: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
d350: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
d360: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
d370: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
d380: 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
d390: 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
d3a0: 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
d3b0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
d3c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d3d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
d3e0: 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
d3f0: 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
d400: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
d410: 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
d420: 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
d430: 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
d440: 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
d450: 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
d460: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
d470: 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
d480: 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
d490: 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
d4a0: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
d4b0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72  = 0;.      inter
d4c0: 73 65 63 74 64 65 73 74 2e 69 50 61 72 6d 20 3d  sectdest.iParm =
d4d0: 20 74 61 62 32 3b 0a 20 20 20 20 20 20 72 63 20   tab2;.      rc 
d4e0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
d4f0: 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65  pParse, p, &inte
d500: 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20  rsectdest);.    
d510: 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
d520: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
d530: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
d540: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
d550: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
d560: 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
d570: 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
d580: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
d590: 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
d5a0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
d5b0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
d5c0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d5d0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
d5e0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
d5f0: 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
d600: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
d610: 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
d620: 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20    ** tables..   
d630: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
d640: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
d650: 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
d660: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
d670: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c  t ){.        Sel
d680: 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
d690: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
d6a0: 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
d6b0: 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
d6c0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
d6d0: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
d6e0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
d6f0: 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
d700: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d710: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
d720: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
d730: 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20  ;.      iCont = 
d740: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d750: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63  abel(v);.      c
d760: 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
d770: 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
d780: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
d790: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d7a0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
d7b0: 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ab1, iBreak);.  
d7c0: 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
d7d0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
d7e0: 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  e);.      iStart
d7f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d800: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  dOp2(v, OP_RowKe
d810: 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20  y, tab1, r1);.  
d820: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d830: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 46  ddOp3(v, OP_NotF
d840: 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
d850: 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  t, r1);.      sq
d860: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
d870: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
d880: 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
d890: 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
d8a0: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
d8b0: 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  1, p->pEList->nE
d8c0: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
d8d0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 2d 31             0, -1
d8e0: 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
d8f0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
d900: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
d910: 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
d920: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d930: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d940: 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61  Next, tab1, iSta
d950: 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
d960: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d970: 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
d980: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d990: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
d9a0: 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  se, tab2, 0);.  
d9b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d9c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
d9d0: 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  e, tab1, 0);.   
d9e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d9f0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
da00: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
da10: 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
da20: 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
da30: 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
da40: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
da50: 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
da60: 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
da70: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
da80: 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
da90: 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
daa0: 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
dab0: 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
dac0: 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
dad0: 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
dae0: 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
daf0: 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
db00: 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
db10: 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
db20: 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
db30: 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
db40: 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
db50: 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
db60: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
db70: 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
db80: 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
db90: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
dba0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
dbb0: 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  sesEphemeral ){.
dbc0: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
dbf0: 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
dc00: 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
dc10: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
dc20: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
dc30: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
dc40: 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
dc50: 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
dc60: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
dc70: 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
dc80: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
dc90: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
dca0: 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
dcb0: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
dcc0: 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
dcd0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
dce0: 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
dd10: 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
dd20: 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
dd30: 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  rt( p->pRightmos
dd40: 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43 6f 6c  t==p );.    nCol
dd50: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
dd60: 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  xpr;.    pKeyInf
dd70: 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
dd80: 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20  locZero(db,.    
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49     sizeof(*pKeyI
ddb0: 6e 66 6f 29 2b 6e 43 6f 6c 2a 28 73 69 7a 65 6f  nfo)+nCol*(sizeo
ddc0: 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 31 29  f(CollSeq*) + 1)
ddd0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79  );.    if( !pKey
dde0: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63  Info ){.      rc
ddf0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
de00: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  .      goto mult
de10: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
de20: 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79 49 6e 66    }..    pKeyInf
de30: 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  o->enc = ENC(db)
de40: 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e  ;.    pKeyInfo->
de50: 6e 46 69 65 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a  nField = nCol;..
de60: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43      for(i=0, apC
de70: 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  oll=pKeyInfo->aC
de80: 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  oll; i<nCol; i++
de90: 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20  , apColl++){.   
dea0: 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c     *apColl = mul
deb0: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
dec0: 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20  pParse, p, i);. 
ded0: 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43       if( 0==*apC
dee0: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  oll ){.        *
def0: 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66  apColl = db->pDf
df00: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
df10: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70      }..    for(p
df20: 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
df30: 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
df40: 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
df50: 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
df60: 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
df70: 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
df80: 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
df90: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
dfa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
dfb0: 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
dfc0: 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
dfd0: 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
dfe0: 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
dff0: 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
e000: 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
e010: 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
e020: 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
e030: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
e040: 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
e050: 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
e060: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e070: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e080: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
e090: 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
e0a0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
e0b0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
e0c0: 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
e0d0: 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
e0e0: 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
e0f0: 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
e100: 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
e110: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
e120: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e130: 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a   pKeyInfo);.  }.
e140: 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
e150: 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d  d:.  pDest->iMem
e160: 20 3d 20 64 65 73 74 2e 69 4d 65 6d 3b 0a 20 20   = dest.iMem;.  
e170: 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65  pDest->nMem = de
e180: 73 74 2e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  st.nMem;.  sqlit
e190: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
e1a0: 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72  b, pDelete);.  r
e1b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
e1c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
e1d0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
e1e0: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  T */../*.** Code
e1f0: 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f   an output subro
e200: 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f  utine for a coro
e210: 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61  utine implementa
e220: 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c  tion of a.** SEL
e230: 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a  ECT statment..**
e240: 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20  .** The data to 
e250: 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e  be output is con
e260: 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69  tained in pIn->i
e270: 4d 65 6d 2e 20 20 54 68 65 72 65 20 61 72 65 0a  Mem.  There are.
e280: 2a 2a 20 70 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c  ** pIn->nMem col
e290: 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75  umns to be outpu
e2a0: 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65  t.  pDest is whe
e2b0: 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  re the output sh
e2c0: 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e  ould.** be sent.
e2d0: 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e  .**.** regReturn
e2e0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
e2f0: 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68  f the register h
e300: 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  olding the subro
e310: 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20  utine.** return 
e320: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  address..**.** I
e330: 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
e340: 20 69 74 20 69 73 20 61 20 74 68 65 20 66 69 72   it is a the fir
e350: 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61  st register in a
e360: 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20   vector that.** 
e370: 72 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76  records the prev
e380: 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65  ious output.  me
e390: 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20  m[regPrev] is a 
e3a0: 66 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c  flag that is fal
e3b0: 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68  se.** if there h
e3c0: 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69  as been no previ
e3d0: 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20  ous output.  If 
e3e0: 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63  regPrev>0 then c
e3f0: 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61  ode is.** genera
e400: 74 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20  ted to suppress 
e410: 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65  duplicates.  pKe
e420: 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f  yInfo is used fo
e430: 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b  r comparing.** k
e440: 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eys..**.** If th
e450: 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e  e LIMIT found in
e460: 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65   p->iLimit is re
e470: 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65  ached, jump imme
e480: 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42  diately to.** iB
e490: 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reak..*/.static 
e4a0: 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70  int generateOutp
e4b0: 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20  utSubroutine(.  
e4c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e4d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e4e0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e4f0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
e500: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
e510: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
e520: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
e530: 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  *pIn,        /* 
e540: 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79  Coroutine supply
e550: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65  ing data */.  Se
e560: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
e570: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
e580: 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20  o send the data 
e590: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
e5a0: 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rn,          /* 
e5b0: 54 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65  The return addre
e5c0: 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ss register */. 
e5d0: 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20   int regPrev,   
e5e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
e5f0: 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69  ious result regi
e600: 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65  ster.  No unique
e610: 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b  ness if 0 */.  K
e620: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
e630: 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f  ,      /* For co
e640: 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65  mparing with pre
e650: 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20  vious entry */. 
e660: 20 69 6e 74 20 70 34 74 79 70 65 2c 20 20 20 20   int p4type,    
e670: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e680: 70 34 20 74 79 70 65 20 66 6f 72 20 70 4b 65 79  p4 type for pKey
e690: 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 42  Info */.  int iB
e6a0: 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
e6b0: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
e6c0: 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d  f we hit the LIM
e6d0: 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  IT */.){.  Vdbe 
e6e0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
e6f0: 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69  be;.  int iConti
e700: 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  nue;.  int addr;
e710: 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ..  addr = sqlit
e720: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
e730: 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75  r(v);.  iContinu
e740: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
e750: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
e760: 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70 6c  /* Suppress dupl
e770: 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e  icates for UNION
e780: 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e  , EXCEPT, and IN
e790: 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20  TERSECT .  */.  
e7a0: 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20  if( regPrev ){. 
e7b0: 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20     int j1, j2;. 
e7c0: 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
e7d0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
e7e0: 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b  IfNot, regPrev);
e7f0: 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74 65  .    j2 = sqlite
e800: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
e810: 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e  P_Compare, pIn->
e820: 69 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c  iMem, regPrev+1,
e830: 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20   pIn->nMem,.    
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
e860: 29 70 4b 65 79 49 6e 66 6f 2c 20 70 34 74 79 70  )pKeyInfo, p4typ
e870: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
e880: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
e890: 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e  Jump, j2+2, iCon
e8a0: 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20  tinue, j2+2);.  
e8b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
e8c0: 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
e8d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e8e0: 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70 49  eCopy(pParse, pI
e8f0: 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67 50 72 65 76  n->iMem, regPrev
e900: 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a  +1, pIn->nMem);.
e910: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e920: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
e930: 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29  ger, 1, regPrev)
e940: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
e950: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
e960: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
e970: 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
e980: 74 68 65 20 74 68 65 20 66 69 72 73 74 20 4f 46  the the first OF
e990: 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20  FSET entries if 
e9a0: 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53  there is an OFFS
e9b0: 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  ET clause.  */. 
e9c0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
e9d0: 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20  , iContinue);.. 
e9e0: 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e   switch( pDest->
e9f0: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
ea00: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
ea10: 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
ea20: 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
ea30: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
ea40: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
ea50: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
ea60: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
ea70: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
ea80: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
ea90: 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
eaa0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
eab0: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
eac0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ead0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
eae0: 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e  In->iMem, pIn->n
eaf0: 4d 65 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Mem, r1);.      
eb00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
eb10: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
eb20: 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
eb30: 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
eb40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
eb50: 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74  OP_Insert, pDest
eb60: 2d 3e 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29  ->iParm, r1, r2)
eb70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
eb80: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
eb90: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
eba0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
ebb0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
ebc0: 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  e, r2);.      sq
ebd0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
ebe0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
ebf0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ec00: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
ec10: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
ec20: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
ec30: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
ec40: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
ec50: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
ec60: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
ec70: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
ec80: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
ec90: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
eca0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
ecb0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
ecc0: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
ecd0: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
ece0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
ecf0: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
ed00: 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73  int r1;.      as
ed10: 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d  sert( pIn->nMem=
ed20: 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  =1 );.      p->a
ed30: 66 66 69 6e 69 74 79 20 3d 20 0a 20 20 20 20 20  ffinity = .     
ed40: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61      sqlite3Compa
ed50: 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45  reAffinity(p->pE
ed60: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
ed70: 2c 20 70 44 65 73 74 2d 3e 61 66 66 69 6e 69 74  , pDest->affinit
ed80: 79 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  y);.      r1 = s
ed90: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
eda0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
edb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
edc0: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
edd0: 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31  rd, pIn->iMem, 1
ede0: 2c 20 72 31 2c 20 26 70 2d 3e 61 66 66 69 6e 69  , r1, &p->affini
edf0: 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ty, 1);.      sq
ee00: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
ee10: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
ee20: 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  rse, pIn->iMem, 
ee30: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
ee40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ee50: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
ee60: 73 74 2d 3e 69 50 61 72 6d 2c 20 72 31 29 3b 0a  st->iParm, r1);.
ee70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
ee80: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
ee90: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
eea0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
eeb0: 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63   0  /* Never occ
eec0: 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20  urs on an ORDER 
eed0: 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  BY query */.    
eee0: 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
eef0: 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
ef00: 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
ef10: 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
ef20: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
ef30: 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
ef40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ef50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
ef60: 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74  nteger, 1, pDest
ef70: 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  ->iParm);.      
ef80: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
ef90: 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61  use will termina
efa0: 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  te the loop for 
efb0: 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
efc0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
efd0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
efe0: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
eff0: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
f000: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
f010: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
f020: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
f030: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
f040: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
f050: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
f060: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
f070: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
f080: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
f090: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f0a0: 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20  In->nMem==1 );. 
f0b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
f0c0: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
f0d0: 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65 73   pIn->iMem, pDes
f0e0: 74 2d 3e 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  t->iParm, 1);.  
f0f0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
f100: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
f110: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
f120: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
f130: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
f140: 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
f150: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
f160: 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
f170: 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
f180: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
f190: 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
f1a0: 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  rs.    ** starti
f1b0: 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69 4d 65  ng at pDest->iMe
f1c0: 6d 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d  m.  Then the co-
f1d0: 72 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a  routine yields..
f1e0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
f1f0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b  SRT_Coroutine: {
f200: 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74  .      if( pDest
f210: 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->iMem==0 ){.   
f220: 20 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d       pDest->iMem
f230: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
f240: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
f250: 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  In->nMem);.     
f260: 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d     pDest->nMem =
f270: 20 70 49 6e 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20   pIn->nMem;.    
f280: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
f290: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
f2a0: 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  arse, pIn->iMem,
f2b0: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 70 44   pDest->iMem, pD
f2c0: 65 73 74 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  est->nMem);.    
f2d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f2e0: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
f2f0: 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a   pDest->iParm);.
f300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f310: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6c   }..    /* Resul
f320: 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
f330: 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
f340: 65 67 69 73 74 65 72 73 2e 20 20 54 68 65 6e 20  egisters.  Then 
f350: 74 68 65 0a 20 20 20 20 2a 2a 20 4f 50 5f 52 65  the.    ** OP_Re
f360: 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69  sultRow opcode i
f370: 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20  s used to cause 
f380: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74  sqlite3_step() t
f390: 6f 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  o return.    ** 
f3a0: 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  the next row of 
f3b0: 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  result..    */. 
f3c0: 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70     case SRT_Outp
f3d0: 75 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ut: {.      sqli
f3e0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f3f0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
f400: 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e  In->iMem, pIn->n
f410: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mem);.      sqli
f420: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
f430: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
f440: 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49  e, pIn->iMem, pI
f450: 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20  n->nMem);.      
f460: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
f470: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
f480: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a  E_OMIT_TRIGGER).
f490: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
f4a0: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
f4b0: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
f4c0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
f4d0: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
f4e0: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
f4f0: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
f500: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
f510: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
f520: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
f530: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
f540: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
f550: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
f560: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
f570: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
f580: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
f590: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
f5a0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72  ault: {.      br
f5b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
f5c0: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
f5d0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
f5e0: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
f5f0: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
f600: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
f610: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
f620: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f630: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
f640: 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20  iLimit, -1);.   
f650: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f660: 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p2(v, OP_IfZero,
f670: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
f680: 61 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ak);.  }..  /* G
f690: 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72  enerate the subr
f6a0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20  outine return.  
f6b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
f6c0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
f6d0: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71  iContinue);.  sq
f6e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
f6f0: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
f700: 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74  gReturn);..  ret
f710: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
f720: 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63  ** Alternative c
f730: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63  ompound select c
f740: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f  ode generator fo
f750: 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65  r cases when the
f760: 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45  re.** is an ORDE
f770: 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  R BY clause..**.
f780: 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71  ** We assume a q
f790: 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c  uery of the foll
f7a0: 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  owing form:.**.*
f7b0: 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e  *      <selectA>
f7c0: 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73    <operator>  <s
f7d0: 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42  electB>  ORDER B
f7e0: 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a  Y <orderbylist>.
f7f0: 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  **.** <operator>
f800: 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e   is one of UNION
f810: 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43   ALL, UNION, EXC
f820: 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
f830: 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20  T.  The idea.** 
f840: 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20  is to code both 
f850: 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73  <selectA> and <s
f860: 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65  electB> with the
f870: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
f880: 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e   as.** co-routin
f890: 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68  es.  Then run th
f8a0: 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e  e co-routines in
f8b0: 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65   parallel and me
f8c0: 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rge the results.
f8d0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ** into the outp
f8e0: 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  ut.  In addition
f8f0: 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f   to the two coro
f900: 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73  utines (called s
f910: 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65  electA and.** se
f920: 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65  lectB) there are
f930: 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a   7 subroutines:.
f940: 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20  **.**    outA:  
f950: 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
f960: 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41  t of the selectA
f970: 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
f980: 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
f990: 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
f9a0: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
f9b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  .**.**    outB: 
f9c0: 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
f9d0: 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
f9e0: 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  B coroutine into
f9f0: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
fa00: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
fa10: 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
fa20: 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74  .  (Only generat
fa30: 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64  ed for UNION and
fa40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
fa50: 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45  UNION ALL.  EXCE
fa60: 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43  PT and INSERTSEC
fa70: 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61  T never output a
fa80: 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20   row that.**    
fa90: 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73           appears
faa0: 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a   only in B.).**.
fab0: 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43  **    AltB:    C
fac0: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
fad0: 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
fae0: 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
faf0: 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A<B..**.**    
fb00: 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AeqB:    Called 
fb10: 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
fb20: 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
fb30: 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42  outines and A==B
fb40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a  ..**.**    AgtB:
fb50: 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
fb60: 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
fb70: 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
fb80: 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a  es and A>B..**.*
fb90: 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61  *    EofA:    Ca
fba0: 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
fbb0: 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
fbc0: 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20   selectA..**.** 
fbd0: 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c     EofB:    Call
fbe0: 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
fbf0: 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
fc00: 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68  electB..**.** Th
fc10: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
fc20: 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66   of the latter f
fc30: 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ive subroutines 
fc40: 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20  depend on which 
fc50: 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
fc60: 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a  s used:.**.**.**
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
fc80: 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55  ON ALL         U
fc90: 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20  NION            
fca0: 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20  EXCEPT          
fcb0: 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20  INTERSECT.**    
fcc0: 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
fcd0: 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
fce0: 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
fcf0: 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
fd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41  ---------.**   A
fd10: 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ltB:   outA, nex
fd20: 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
fd30: 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
fd40: 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
fd50: 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42  xtA.**.**   AeqB
fd60: 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
fd70: 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
fd80: 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20            nextA 
fd90: 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65          outA, ne
fda0: 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42  xtA.**.**   AgtB
fdb0: 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
fdc0: 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
fdd0: 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20            nextB 
fde0: 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42             nextB
fdf0: 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20  .**.**   EofA:  
fe00: 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
fe10: 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
fe20: 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20         halt     
fe30: 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
fe40: 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74  **   EofB:   out
fe50: 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
fe60: 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
fe70: 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
fe80: 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49      halt.**.** I
fe90: 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42  n the AltB, AeqB
fea0: 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f  , and AgtB subro
feb0: 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f  utines, an EOF o
fec0: 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n A following ne
fed0: 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e  xtA.** causes an
fee0: 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
fef0: 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45  to EofA and an E
ff00: 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e  OF on B followin
ff10: 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a  g nextB causes.*
ff20: 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  * an immediate j
ff30: 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69  ump to EofB.  Wi
ff40: 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f  thin EofA and Eo
ff50: 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65  fB, and EOF on e
ff60: 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f  ntry or.** follo
ff70: 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65  wing nextX cause
ff80: 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  s a jump to the 
ff90: 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63  end of the selec
ffa0: 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  t processing..**
ffb0: 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65  .** Duplicate re
ffc0: 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49  moval in the UNI
ffd0: 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
ffe0: 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20  INTERSECT cases 
fff0: 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69  is handled.** wi
10000 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  thin the output 
10010 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
10020 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65   regPrev registe
10030 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20  r set holds the 
10040 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75  previously.** ou
10050 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63  tput value.  A c
10060 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64  omparison is mad
10070 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76  e against this v
10080 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74  alue and the out
10090 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65  put.** is skippe
100a0 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65  d if the next re
100b0 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74  sults would be t
100c0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
100d0 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54  revious..**.** T
100e0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
100f0 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70  n plan is to imp
10100 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63  lement the two c
10110 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65  oroutines and se
10120 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e  ven.** subroutin
10130 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70  es first, then p
10140 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c  ut the control l
10150 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74  ogic at the bott
10160 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a  om.  Like this:.
10170 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67  **.**          g
10180 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20  oto Init.**     
10190 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coA: coroutine f
101a0 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41  or left query (A
101b0 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f  ).**     coB: co
101c0 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68  routine for righ
101d0 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20  t query (B).**  
101e0 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f    outA: output o
101f0 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20  ne row of A.**  
10200 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f    outB: output o
10210 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49  ne row of B (UNI
10220 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c  ON and UNION ALL
10230 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66   only).**    Eof
10240 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66  A: ....**    Eof
10250 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74  B: ....**    Alt
10260 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71  B: ....**    Aeq
10270 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74  B: ....**    Agt
10280 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69  B: ....**    Ini
10290 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  t: initialize co
102a0 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
102b0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  s.**          yi
102c0 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20  eld coA.**      
102d0 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f      if eof(A) go
102e0 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20  to EofA.**      
102f0 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a      yield coB.**
10300 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
10310 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a  (B) goto EofB.**
10320 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72      Cmpr: Compar
10330 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20  e A, B.**       
10340 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65     Jump AltB, Ae
10350 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20  qB, AgtB.**     
10360 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57  End: ....**.** W
10370 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71  e call AltB, Aeq
10380 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61  B, AgtB, EofA, a
10390 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74  nd EofB "subrout
103a0 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61  ines" but they a
103b0 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c  re not.** actual
103c0 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20  ly called using 
103d0 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64  Gosub and they d
103e0 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45  o not Return.  E
103f0 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f  ofA and EofB loo
10400 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64  p.** until all d
10410 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
10420 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68   then jump to th
10430 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41  e "end" labe.  A
10440 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e  ltB, AeqB,.** an
10450 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65  d AgtB jump to e
10460 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f  ither L2 or to o
10470 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f  ne of EofA or Eo
10480 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  fB..*/.#ifndef S
10490 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
104a0 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69  UND_SELECT.stati
104b0 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
104c0 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
104d0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
104e0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
104f0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
10500 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
10510 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
10520 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
10530 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
10540 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
10550 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
10560 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
10570 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
10580 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
10590 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
105a0 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ers */.  Select 
105b0 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
105c0 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
105d0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
105e0 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
105f0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
10600 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
10610 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
10620 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
10630 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20  t destA;     /* 
10640 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
10650 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20  coroutine A */. 
10660 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
10670 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  B;     /* Destin
10680 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
10690 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72  ine B */.  int r
106a0 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20  egAddrA;        
106b0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
106c0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
106d0 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
106e0 20 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20 20   int regEofA;   
106f0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74         /* Flag t
10700 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20  o indicate when 
10710 73 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d 70  select-A is comp
10720 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  lete */.  int re
10730 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20  gAddrB;         
10740 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
10750 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42  ter for select-B
10760 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
10770 69 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20 20  int regEofB;    
10780 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f        /* Flag to
10790 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73   indicate when s
107a0 65 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70 6c  elect-B is compl
107b0 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ete */.  int add
107c0 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
107d0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
107e0 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
107f0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
10800 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
10810 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
10820 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
10830 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
10840 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
10850 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
10860 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
10870 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
10880 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
10890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
108a0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
108b0 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
108c0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
108d0 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
108e0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
108f0 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
10900 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
10910 69 6e 74 20 61 64 64 72 4f 75 74 42 3b 20 20 20  int addrOutB;   
10920 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10930 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
10940 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
10950 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
10960 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
10970 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
10980 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
10990 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
109a0 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20  addrEofB;       
109b0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
109c0 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68  the select-B-exh
109d0 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
109e0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
109f0 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ltB;         /* 
10a00 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
10a10 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  <B subroutine */
10a20 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b  .  int addrAeqB;
10a30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10a40 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20  ess of the A==B 
10a50 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
10a60 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20  int addrAgtB;   
10a70 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10a80 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72   of the A>B subr
10a90 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10aa0 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20  regLimitA;      
10ab0 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
10ac0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
10ad0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
10ae0 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itB;        /* L
10af0 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
10b00 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
10b10 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20  int regPrev;    
10b20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65        /* A range
10b30 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f   of registers to
10b40 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f   hold previous o
10b50 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73  utput */.  int s
10b60 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20  avedLimit;      
10b70 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
10b80 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a  of p->iLimit */.
10b90 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65    int savedOffse
10ba0 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  t;      /* Saved
10bb0 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66   value of p->iOf
10bc0 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  fset */.  int la
10bd0 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20  belCmpr;        
10be0 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
10bf0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65   start of the me
10c00 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  rge algorithm */
10c10 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b  .  int labelEnd;
10c20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
10c30 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  l for the end of
10c40 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c   the overall SEL
10c50 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e  ECT stmt */.  in
10c60 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20  t j1;           
10c70 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74      /* Jump inst
10c80 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65  ructions that ge
10c90 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f  t retargetted */
10ca0 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
10cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
10cc0 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e  of TK_ALL, TK_UN
10cd0 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20  ION, TK_EXCEPT, 
10ce0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a  TK_INTERSECT */.
10cf0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44    KeyInfo *pKeyD
10d00 75 70 3b 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61  up;     /* Compa
10d10 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
10d20 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  n for duplicate 
10d30 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79  removal */.  Key
10d40 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b  Info *pKeyMerge;
10d50 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e     /* Comparison
10d60 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
10d70 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f   merging rows */
10d80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
10d90 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
10da0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
10db0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10dc0 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68  OrderBy;   /* Th
10dd0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
10de0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65  e */.  int nOrde
10df0 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy;         /* 
10e00 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
10e10 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
10e20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
10e30 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20  *aPermute;      
10e40 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f    /* Mapping fro
10e50 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  m ORDER BY terms
10e60 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63   to result set c
10e70 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61 73 73  olumns */..  ass
10e80 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
10e90 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  !=0 );.  db = pP
10ea0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
10eb0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
10ec0 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
10ed0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10ee0 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71  .  labelEnd = sq
10ef0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
10f00 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d  el(v);.  labelCm
10f10 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pr = sqlite3Vdbe
10f20 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a  MakeLabel(v);...
10f30 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68    /* Patch up th
10f40 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
10f50 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d  e.  */.  op = p-
10f60 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20  >op;  .  pPrior 
10f70 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
10f80 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
10f90 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
10fa0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
10fb0 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74  rderBy;.  assert
10fc0 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ( pOrderBy );.  
10fd0 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
10fe0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f  rBy->nExpr;..  /
10ff0 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20  * For operators 
11000 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e  other than UNION
11010 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20   ALL we have to 
11020 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20  make sure that. 
11030 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
11040 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65   clause covers e
11050 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
11060 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64   result set.  Ad
11070 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20  d.  ** terms to 
11080 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
11090 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79  use as necessary
110a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21  ..  */.  if( op!
110b0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66  =TK_ALL ){.    f
110c0 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c  or(i=1; db->mall
110d0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69  ocFailed==0 && i
110e0 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
110f0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
11100 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
11110 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
11120 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
11130 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a  m=pOrderBy->a; j
11140 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20  <nOrderBy; j++, 
11150 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
11160 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
11170 3e 69 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  >iCol>0 );.     
11180 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
11190 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
111a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
111b0 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
111c0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
111d0 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ew = sqlite3PExp
111e0 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54  r(pParse, TK_INT
111f0 45 47 45 52 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  EGER, 0, 0, 0);.
11200 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
11210 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
11220 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
11230 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
11240 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
11250 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 54 61         pNew->iTa
11260 62 6c 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  ble = i;.       
11270 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69   pOrderBy = sqli
11280 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
11290 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  d(pParse, pOrder
112a0 42 79 2c 20 70 4e 65 77 2c 20 30 29 3b 0a 20 20  By, pNew, 0);.  
112b0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
112c0 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 69 43  a[nOrderBy++].iC
112d0 6f 6c 20 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  ol = i;.      }.
112e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
112f0 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
11300 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69  arison permutati
11310 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74  on and keyinfo t
11320 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68  hat is used with
11330 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74  .  ** the permut
11340 61 74 69 6f 6e 20 69 6e 20 6f 72 64 65 72 20 74  ation in order t
11350 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 74 6f  o comparisons to
11360 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
11370 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
11380 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
11390 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
113a0 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
113b0 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
113c0 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
113d0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
113e0 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
113f0 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
11400 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
11410 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
11420 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
11430 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
11440 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
11450 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
11460 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
11470 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
11480 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f  , sizeof(int)*nO
11490 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61  rderBy);.  if( a
114a0 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73  Permute ){.    s
114b0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
114c0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
114d0 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
114e0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f  OrderBy->a; i<nO
114f0 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74  rderBy; i++, pIt
11500 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  em++){.      ass
11510 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c  ert( pItem->iCol
11520 3e 30 20 20 26 26 20 70 49 74 65 6d 2d 3e 69 43  >0  && pItem->iC
11530 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<=p->pEList->n
11540 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50  Expr );.      aP
11550 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65  ermute[i] = pIte
11560 6d 2d 3e 69 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  m->iCol - 1;.   
11570 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65   }.    pKeyMerge
11580 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   =.      sqlite3
11590 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
115a0 73 69 7a 65 6f 66 28 2a 70 4b 65 79 4d 65 72 67  sizeof(*pKeyMerg
115b0 65 29 2b 6e 4f 72 64 65 72 42 79 2a 28 73 69 7a  e)+nOrderBy*(siz
115c0 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
115d0 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 4d  );.    if( pKeyM
115e0 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 70 4b  erge ){.      pK
115f0 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72  eyMerge->aSortOr
11600 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79  der = (u8*)&pKey
11610 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72  Merge->aColl[nOr
11620 64 65 72 42 79 5d 3b 0a 20 20 20 20 20 20 70 4b  derBy];.      pK
11630 65 79 4d 65 72 67 65 2d 3e 6e 46 69 65 6c 64 20  eyMerge->nField 
11640 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = nOrderBy;.    
11650 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 65 6e 63    pKeyMerge->enc
11660 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20   = ENC(db);.    
11670 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72    for(i=0; i<nOr
11680 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  derBy; i++){.   
11690 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
116a0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70  oll;.        Exp
116b0 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65  r *pTerm = pOrde
116c0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
116d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65  .        if( pTe
116e0 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45  rm->flags & EP_E
116f0 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  xpCollate ){.   
11700 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
11710 54 65 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20  Term->pColl;.   
11720 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11730 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75        pColl = mu
11740 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
11750 28 70 50 61 72 73 65 2c 20 70 2c 20 61 50 65 72  (pParse, p, aPer
11760 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  mute[i]);.      
11770 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73      pTerm->flags
11780 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74   |= EP_ExpCollat
11790 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  e;.          pTe
117a0 72 6d 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c  rm->pColl = pCol
117b0 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  l;.        }.   
117c0 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e       pKeyMerge->
117d0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c  aColl[i] = pColl
117e0 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65  ;.        pKeyMe
117f0 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  rge->aSortOrder[
11800 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  i] = pOrderBy->a
11810 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
11820 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11830 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65  else{.    pKeyMe
11840 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rge = 0;.  }..  
11850 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20  /* Reattach the 
11860 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11870 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  to the query..  
11880 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  */.  p->pOrderBy
11890 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
118a0 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
118b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
118c0 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  tDup(pParse->db,
118d0 20 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 2f   pOrderBy);..  /
118e0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e  * Allocate a ran
118f0 67 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  ge of temporary 
11900 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68  registers and th
11910 65 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64  e KeyInfo needed
11920 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f  .  ** for the lo
11930 67 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73  gic that removes
11940 20 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c   duplicate resul
11950 74 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a  t rows when the.
11960 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73    ** operator is
11970 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
11980 6f 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75  or INTERSECT (bu
11990 74 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29  t not UNION ALL)
119a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
119b0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
119c0 65 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65  egPrev = 0;.  }e
119d0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
119e0 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
119f0 6e 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  nExpr;.    asser
11a00 74 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78  t( nOrderBy>=nEx
11a10 70 72 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65  pr );.    regPre
11a20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  v = sqlite3GetTe
11a30 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
11a40 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 73 71  nExpr+1);.    sq
11a50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11a60 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
11a70 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
11a80 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65  pKeyDup = sqlite
11a90 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
11aa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11ab0 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79      sizeof(*pKey
11ac0 44 75 70 29 20 2b 20 6e 45 78 70 72 2a 28 73 69  Dup) + nExpr*(si
11ad0 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
11ae0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  ) );.    if( pKe
11af0 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 70 4b  yDup ){.      pK
11b00 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
11b10 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 44 75  r = (u8*)&pKeyDu
11b20 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d 3b  p->aColl[nExpr];
11b30 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e  .      pKeyDup->
11b40 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70 72 3b 0a  nField = nExpr;.
11b50 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 65        pKeyDup->e
11b60 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
11b70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11b80 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
11b90 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f      pKeyDup->aCo
11ba0 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c  ll[i] = multiSel
11bb0 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
11bc0 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
11bd0 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
11be0 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  Order[i] = 0;.  
11bf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11c00 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20   .  /* Separate 
11c10 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65  the left and the
11c20 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f   right query fro
11c30 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20  m one another.  
11c40 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
11c50 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 52   0;.  pPrior->pR
11c60 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20  ightmost = 0;.  
11c70 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
11c80 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
11c90 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e, p, p->pOrderB
11ca0 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69  y, "ORDER");.  i
11cb0 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f  f( pPrior->pPrio
11cc0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
11cd0 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
11ce0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
11cf0 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70  Prior, pPrior->p
11d00 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
11d10 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
11d20 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72  pute the limit r
11d30 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f  egisters */.  co
11d40 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
11d50 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c  ers(pParse, p, l
11d60 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20  abelEnd);.  if( 
11d70 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d  p->iLimit && op=
11d80 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72  =TK_ALL ){.    r
11d90 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61  egLimitA = ++pPa
11da0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
11db0 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61  egLimitB = ++pPa
11dc0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
11dd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11de0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e  (v, OP_Copy, p->
11df0 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66  iOffset ? p->iOf
11e00 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d  fset+1 : p->iLim
11e10 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  it,.            
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e30 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29        regLimitA)
11e40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11e50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
11e60 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72  py, regLimitA, r
11e70 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c  egLimitB);.  }el
11e80 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  se{.    regLimit
11e90 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20  A = regLimitB = 
11ea0 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
11eb0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
11ec0 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e  ->pLimit);.  p->
11ed0 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71  pLimit = 0;.  sq
11ee0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
11ef0 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
11f00 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20  .  p->pOffset = 
11f10 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d  0;..  regAddrA =
11f20 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
11f30 0a 20 20 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70  .  regEofA = ++p
11f40 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
11f50 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72  egAddrB = ++pPar
11f60 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45  se->nMem;.  regE
11f70 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ofB = ++pParse->
11f80 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20  nMem;.  regOutA 
11f90 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
11fa0 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b  ;.  regOutB = ++
11fb0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
11fc0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
11fd0 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52  tInit(&destA, SR
11fe0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
11ff0 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
12000 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
12010 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f  &destB, SRT_Coro
12020 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29  utine, regAddrB)
12030 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73  ;..  /* Jump pas
12040 74 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 75  t the various su
12050 62 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 63 6f  broutines and co
12060 72 6f 75 74 69 6e 65 73 20 74 6f 20 74 68 65 20  routines to the 
12070 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20  main.  ** merge 
12080 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d  loop.  */.  j1 =
12090 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
120a0 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
120b0 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20    addrSelectA = 
120c0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
120d0 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f  ntAddr(v);...  /
120e0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
120f0 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
12100 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
12110 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  atement to the. 
12120 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20   ** left of the 
12130 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f  compound operato
12140 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65  r - the "A" sele
12150 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ct..  */.  VdbeN
12160 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
12170 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20  Begin coroutine 
12180 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22  for left SELECT"
12190 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c  ));.  pPrior->iL
121a0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41  imit = regLimitA
121b0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
121c0 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
121d0 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c  , &destA);.  sql
121e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
121f0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
12200 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c   regEofA);.  sql
12210 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12220 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
12230 64 64 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  ddrA);.  VdbeNoo
12240 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  pComment((v, "En
12250 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  d coroutine for 
12260 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
12270 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
12280 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
12290 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
122a0 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a  T statement on .
122b0 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d    ** the right -
122c0 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a   the "B" select.
122d0 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63    */.  addrSelec
122e0 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
122f0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
12300 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12310 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72  t((v, "Begin cor
12320 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
12330 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61   SELECT"));.  sa
12340 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  vedLimit = p->iL
12350 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66  imit;.  savedOff
12360 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  set = p->iOffset
12370 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
12380 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e  regLimitB;.  p->
12390 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20  iOffset = 0;  . 
123a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
123b0 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42  Parse, p, &destB
123c0 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  );.  p->iLimit =
123d0 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70   savedLimit;.  p
123e0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65  ->iOffset = save
123f0 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74  dOffset;.  sqlit
12400 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12410 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
12420 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74  egEofB);.  sqlit
12430 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12440 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
12450 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  rB);.  VdbeNoopC
12460 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
12470 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
12480 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a  ght SELECT"));..
12490 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
124a0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
124b0 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
124c0 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41  ent row of the A
124d0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
124e0 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
124f0 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
12500 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
12510 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
12520 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
12530 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b  outine for A"));
12540 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65  .  addrOutA = ge
12550 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
12560 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74  p, &destA, pDest
12590 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20  , regOutA,.     
125a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
125b0 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 50 34  rev, pKeyDup, P4
125c0 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
125d0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a  , labelEnd);.  .
125e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
125f0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
12600 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
12610 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42  ent row of the B
12620 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
12630 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
12640 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
12650 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
12660 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
12670 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  L || op==TK_UNIO
12680 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  N ){.    VdbeNoo
12690 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
126a0 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
126b0 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f   B"));.    addrO
126c0 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utB = generateOu
126d0 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
126e0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
126f0 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
12700 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  B, pDest, regOut
12710 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
12720 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
12730 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  yDup, P4_KEYINFO
12740 5f 53 54 41 54 49 43 2c 20 6c 61 62 65 6c 45 6e  _STATIC, labelEn
12750 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  d);.  }..  /* Ge
12760 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
12770 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
12780 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
12790 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61   select A.  ** a
127a0 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
127b0 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
127c0 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a  lect B remains..
127d0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
127e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
127f0 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  A subroutine"));
12800 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58  .  if( op==TK_EX
12810 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
12820 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
12830 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74  addrEofA = sqlit
12840 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12850 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
12860 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20  lEnd);.  }else{ 
12870 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d   .    addrEofA =
12880 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12890 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
128a0 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  EofB, labelEnd);
128b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
128c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
128d0 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
128e0 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71 6c 69  rOutB);.    sqli
128f0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12900 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
12910 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  drB);.    sqlite
12920 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12930 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
12940 6f 66 41 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ofA);.  }..  /* 
12950 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
12960 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
12970 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
12980 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a  om select B.  **
12990 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
129a0 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
129b0 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73  select A remains
129c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
129d0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
129e0 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
129f0 61 64 64 72 45 6f 66 41 3b 0a 20 20 7d 65 6c 73  addrEofA;.  }els
12a00 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
12a10 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
12a20 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-B subroutine")
12a30 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  );.    addrEofB 
12a40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12a50 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
12a60 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29  gEofA, labelEnd)
12a70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12a80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
12a90 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
12aa0 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c  drOutA);.    sql
12ab0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12ac0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
12ad0 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrA);.    sqlit
12ae0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12af0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
12b00 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  EofB);.  }..  /*
12b10 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
12b20 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
12b30 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20  e of A<B.  */.  
12b40 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
12b50 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72  (v, "A-lt-B subr
12b60 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
12b70 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAltB = sqlite3V
12b80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12b90 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
12ba0 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c  addrOutA);.  sql
12bb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12bc0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
12bd0 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
12be0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12bf0 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64  _If, regEofA, ad
12c00 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74  drEofA);.  sqlit
12c10 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12c20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
12c30 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65  lCmpr);..  /* Ge
12c40 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
12c50 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
12c60 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66  f A==B.  */.  if
12c70 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
12c80 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
12c90 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65  ddrAltB;.  }else
12ca0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45   if( op==TK_INTE
12cb0 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
12cc0 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
12cd0 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b  ;.    addrAltB++
12ce0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56  ;.  }else{.    V
12cf0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
12d00 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f  v, "A-eq-B subro
12d10 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
12d20 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c  drAeqB =.    sql
12d30 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12d40 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
12d50 64 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrA);.    sqlit
12d60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12d70 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
12d80 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 73  addrEofA);.    s
12d90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12da0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
12db0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a  labelCmpr);.  }.
12dc0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
12dd0 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
12de0 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20  e case of A>B.  
12df0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
12e00 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42  ment((v, "A-gt-B
12e10 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
12e20 20 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c    addrAgtB = sql
12e30 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
12e40 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70  ddr(v);.  if( op
12e50 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d  ==TK_ALL || op==
12e60 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
12e70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12e80 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
12e90 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
12ea0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12eb0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12ec0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
12ed0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12ee0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
12ef0 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f   regEofB, addrEo
12f00 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fB);.  sqlite3Vd
12f10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
12f20 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
12f30 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  r);..  /* This c
12f40 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f  ode runs once to
12f50 20 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72   initialize ever
12f60 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73  ything..  */.  s
12f70 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
12f80 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c  re(v, j1);.  sql
12f90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12fa0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
12fb0 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c   regEofA);.  sql
12fc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12fd0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
12fe0 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c   regEofB);.  sql
12ff0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13000 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41  , OP_Gosub, regA
13010 64 64 72 41 2c 20 61 64 64 72 53 65 6c 65 63 74  ddrA, addrSelect
13020 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
13030 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
13040 73 75 62 2c 20 72 65 67 41 64 64 72 42 2c 20 61  sub, regAddrB, a
13050 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 73  ddrSelectB);.  s
13060 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13070 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
13080 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  fA, addrEofA);. 
13090 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
130a0 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
130b0 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  EofB, addrEofB);
130c0 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74  ..  /* Implement
130d0 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20   the main merge 
130e0 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
130f0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
13100 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  bel(v, labelCmpr
13110 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13120 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72  AddOp4(v, OP_Per
13130 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  mutation, 0, 0, 
13140 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75  0, (char*)aPermu
13150 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29  te, P4_INTARRAY)
13160 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13170 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
13180 61 72 65 2c 20 64 65 73 74 41 2e 69 4d 65 6d 2c  are, destA.iMem,
13190 20 64 65 73 74 42 2e 69 4d 65 6d 2c 20 6e 4f 72   destB.iMem, nOr
131a0 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
131b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131c0 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65  (char*)pKeyMerge
131d0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
131e0 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33  DOFF);.  sqlite3
131f0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13200 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c  _Jump, addrAltB,
13210 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41   addrAeqB, addrA
13220 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  gtB);..  /* Rele
13230 61 73 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65  ase temporary re
13240 67 69 73 74 65 72 73 0a 20 20 2a 2f 0a 20 20 69  gisters.  */.  i
13250 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20  f( regPrev ){.  
13260 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
13270 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
13280 2c 20 72 65 67 50 72 65 76 2c 20 6e 4f 72 64 65  , regPrev, nOrde
13290 72 42 79 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rBy+1);.  }..  /
132a0 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68  * Jump to the th
132b0 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
132c0 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  r to terminate t
132d0 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
132e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
132f0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
13300 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  lEnd);..  /* Set
13310 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
13320 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20  utput columns.  
13330 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
13340 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
13350 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  t ){.    Select 
13360 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72  *pFirst = pPrior
13370 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46 69  ;.    while( pFi
13380 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
13390 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
133a0 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72  Prior;.    gener
133b0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
133c0 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
133d0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  ->pEList);.  }..
133e0 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20    /* Reassembly 
133f0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
13400 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ry so that it wi
13410 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72  ll be freed corr
13420 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68  ectly.  ** by th
13430 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
13440 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  on */.  if( p->p
13450 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  Prior ){.    sql
13460 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
13470 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b  (db, p->pPrior);
13480 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72  .  }.  p->pPrior
13490 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a   = pPrior;..  /*
134a0 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20  ** TBD:  Insert 
134b0 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73  subroutine calls
134c0 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72   to close cursor
134d0 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a  s on incomplete.
134e0 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65    **** subquerie
134f0 73 20 2a 2a 2a 2a 2f 0a 20 20 72 65 74 75 72 6e  s ****/.  return
13500 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
13510 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
13520 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
13530 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
13540 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13550 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72  _VIEW)./* Forwar
13560 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
13570 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
13580 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69  bstExprList(sqli
13590 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c  te3*, ExprList*,
135a0 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29   int, ExprList*)
135b0 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  ;.static void su
135c0 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65  bstSelect(sqlite
135d0 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e  3*, Select *, in
135e0 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a  t, ExprList *);.
135f0 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
13600 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
13610 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
13620 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
13630 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
13640 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
13650 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
13660 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
13670 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
13680 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
13690 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
136a0 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
136b0 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
136c0 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
136d0 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
136e0 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
136f0 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
13700 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
13710 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
13720 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
13730 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
13740 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
13750 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
13760 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
13770 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
13780 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
13790 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
137a0 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
137b0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
137c0 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
137d0 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
137e0 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
137f0 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
13800 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
13810 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
13820 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
13830 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
13840 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
13850 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
13860 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69  ubstExpr(.  sqli
13870 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
13880 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
13890 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20   errors to this 
138a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
138b0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
138c0 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77      /* Expr in w
138d0 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f  hich substitutio
138e0 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e  n occurs */.  in
138f0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
13900 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
13910 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
13920 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
13930 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74  st    /* Substit
13940 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ute expressions 
13950 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70  */.){.  if( pExp
13960 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
13970 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
13980 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
13990 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  pr->iTable==iTab
139a0 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  le ){.    if( pE
139b0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
139c0 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  {.      pExpr->o
139d0 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
139e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
139f0 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  pr *pNew;.      
13a00 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
13a10 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 && pExpr->iCol
13a20 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  umn<pEList->nExp
13a30 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
13a40 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
13a50 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
13a60 67 68 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  ght==0 && pExpr-
13a70 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  >pList==0 );.   
13a80 20 20 20 70 4e 65 77 20 3d 20 70 45 4c 69 73 74     pNew = pEList
13a90 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ->a[pExpr->iColu
13aa0 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  mn].pExpr;.     
13ab0 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 30   assert( pNew!=0
13ac0 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
13ad0 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a  >op = pNew->op;.
13ae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
13af0 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 29 3b  xpr->pLeft==0 );
13b00 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .      pExpr->pL
13b10 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
13b20 72 44 75 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70  rDup(db, pNew->p
13b30 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 73 73  Left);.      ass
13b40 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67  ert( pExpr->pRig
13b50 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ht==0 );.      p
13b60 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
13b70 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
13b80 2c 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 29 3b  , pNew->pRight);
13b90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13ba0 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  Expr->pList==0 )
13bb0 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70  ;.      pExpr->p
13bc0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
13bd0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4e  prListDup(db, pN
13be0 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ew->pList);.    
13bf0 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
13c00 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 3b 0a  = pNew->iTable;.
13c10 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61        pExpr->pTa
13c20 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61 62 3b 0a  b = pNew->pTab;.
13c30 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
13c40 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e 69 43 6f  lumn = pNew->iCo
13c50 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 45 78 70  lumn;.      pExp
13c60 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65 77 2d 3e  r->iAgg = pNew->
13c70 69 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69  iAgg;.      sqli
13c80 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c  te3TokenCopy(db,
13c90 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20   &pExpr->token, 
13ca0 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29 3b 0a 20  &pNew->token);. 
13cb0 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
13cc0 6e 43 6f 70 79 28 64 62 2c 20 26 70 45 78 70 72  nCopy(db, &pExpr
13cd0 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77 2d 3e 73  ->span, &pNew->s
13ce0 70 61 6e 29 3b 0a 20 20 20 20 20 20 70 45 78 70  pan);.      pExp
13cf0 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  r->pSelect = sql
13d00 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
13d10 2c 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 29  , pNew->pSelect)
13d20 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 66  ;.      pExpr->f
13d30 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 66 6c 61  lags = pNew->fla
13d40 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  gs;.    }.  }els
13d50 65 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  e{.    substExpr
13d60 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
13d70 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
13d80 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
13d90 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69  r(db, pExpr->pRi
13da0 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
13db0 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 53  ist);.    substS
13dc0 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d  elect(db, pExpr-
13dd0 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  >pSelect, iTable
13de0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
13df0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
13e00 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2c 20 69   pExpr->pList, i
13e10 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
13e20 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
13e30 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
13e40 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
13e50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
13e60 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
13e70 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  here */.  ExprLi
13e80 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
13e90 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61  * List to scan a
13ea0 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nd in which to m
13eb0 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20  ake substitutes 
13ec0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
13ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
13ee0 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  le to be substit
13ef0 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uted */.  ExprLi
13f00 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
13f10 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
13f20 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ues */.){.  int 
13f30 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
13f40 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
13f50 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
13f60 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
13f70 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
13f80 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
13f90 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
13fa0 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
13fb0 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
13fc0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
13fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f           /* Repo
13fe0 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  rt malloc errors
13ff0 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
14000 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
14010 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
14020 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ent in which to 
14030 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f  make substitutio
14040 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ns */.  int iTab
14050 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
14060 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c  Table to be repl
14070 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  aced */.  ExprLi
14080 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
14090 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
140a0 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ues */.){.  if( 
140b0 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  !p ) return;.  s
140c0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
140d0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61 62   p->pEList, iTab
140e0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
140f0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
14100 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 54   p->pGroupBy, iT
14110 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
14120 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
14130 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
14140 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
14150 0a 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c  .  substExpr(db,
14160 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61   p->pHaving, iTa
14170 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
14180 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
14190 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c  >pWhere, iTable,
141a0 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
141b0 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70  tSelect(db, p->p
141c0 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70  Prior, iTable, p
141d0 45 4c 69 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  EList);.}.#endif
141e0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
141f0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
14200 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
14210 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
14220 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
14230 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
14240 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
14250 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14260 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73  VIEW)./*.** This
14270 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
14280 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62  s to flatten sub
14290 71 75 65 72 69 65 73 20 69 6e 20 6f 72 64 65 72  queries in order
142a0 20 74 6f 20 73 70 65 65 64 0a 2a 2a 20 65 78 65   to speed.** exe
142b0 63 75 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75  cution.  It retu
142c0 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65  rns 1 if it make
142d0 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20  s changes and 0 
142e0 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67  if no flattening
142f0 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  .** occurs..**.*
14300 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
14310 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
14320 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
14330 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
14340 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
14350 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
14360 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
14370 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
14380 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
14390 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
143a0 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
143b0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
143c0 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
143d0 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
143e0 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
143f0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
14400 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
14410 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
14420 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14430 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
14440 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
14450 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
14460 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
14470 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
14480 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
14490 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
144a0 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
144b0 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
144c0 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
144d0 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
144e0 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
144f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14500 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
14510 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
14520 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
14530 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
14540 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
14550 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
14560 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
14570 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
14580 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
14590 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
145a0 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
145b0 20 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67   simpification g
145c0 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65  ives the same re
145d0 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79  sult.** but only
145e0 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65   has to scan the
145f0 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64   data once.  And
14600 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73   because indices
14610 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74   might .** exist
14620 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31   on the table t1
14630 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61  , a complete sca
14640 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69  n of the data mi
14650 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65  ght be.** avoide
14660 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e  d..**.** Flatten
14670 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65  ing is only atte
14680 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20  mpted if all of 
14690 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
146a0 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
146b0 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (1)  The subquer
146c0 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
146d0 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
146e0 68 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  h use aggregates
146f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54  ..**.**   (2)  T
14700 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
14710 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
14720 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
14730 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
14740 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54  ..**.**   (3)  T
14750 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
14760 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  ot the right ope
14770 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
14780 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20  uter join.**    
14790 20 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20      (Originally 
147a0 74 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74  ticket #306.  St
147b0 72 65 6e 67 68 74 65 6e 65 64 20 62 79 20 74 69  renghtened by ti
147c0 63 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a  cket #3300).**.*
147d0 2a 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62  *   (4)  The sub
147e0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53  query is not DIS
147f0 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75 74  TINCT or the out
14800 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
14810 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
14820 28 35 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (5)  The subquer
14830 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43  y is not DISTINC
14840 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
14850 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
14860 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72  e.**        aggr
14870 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
14880 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
14890 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
148a0 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
148b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
148c0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
148d0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
148e0 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
148f0 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
14900 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  use..**.**   (8)
14910 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
14920 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
14930 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
14940 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
14950 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20  in..**.**   (9) 
14960 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
14970 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
14980 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
14990 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
149a0 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65  .**        aggre
149b0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  gates..**.**  (1
149c0 30 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  0)  The subquery
149d0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
149e0 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
149f0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
14a00 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75   not.**        u
14a10 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
14a20 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
14a30 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
14a40 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
14a50 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42  oth have ORDER B
14a60 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  Y clauses..**.**
14a70 20 20 28 31 32 29 20 20 4e 6f 74 20 69 6d 70 6c    (12)  Not impl
14a80 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d  emented.  Subsum
14a90 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74  ed into restrict
14aa0 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72  ion (3).  Was pr
14ab0 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20  eviously.**     
14ac0 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65     a separate re
14ad0 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69  striction derivi
14ae0 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23  ng from ticket #
14af0 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29  350..**.**  (13)
14b00 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
14b10 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  nd outer query d
14b20 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c  o not both use L
14b30 49 4d 49 54 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  IMIT.**.**  (14)
14b40 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
14b50 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  oes not use OFFS
14b60 45 54 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20  ET.**.**  (15)  
14b70 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
14b80 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
14b90 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
14ba0 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
14bb0 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20    subquery does 
14bc0 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 61 6e  not have both an
14bd0 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 61 20   ORDER BY and a 
14be0 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a  LIMIT clause..**
14bf0 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
14c00 6b 65 74 20 23 32 33 33 39 29 0a 2a 2a 0a 2a 2a  ket #2339).**.**
14c10 20 20 28 31 36 29 20 20 54 68 65 20 6f 75 74 65    (16)  The oute
14c20 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
14c30 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
14c40 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
14c50 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63  .**        not c
14c60 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e  ontain ORDER BY.
14c70 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29    (Ticket #2942)
14c80 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e    This used to n
14c90 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20  ot matter.**    
14ca0 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74      until we int
14cb0 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75  roduced the grou
14cc0 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74  p_concat() funct
14cd0 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31  ion.  .**.**  (1
14ce0 37 29 20 20 54 68 65 20 73 75 62 2d 71 75 65 72  7)  The sub-quer
14cf0 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f  y is not a compo
14d00 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69  und select, or i
14d10 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t is a UNION ALL
14d20 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70   .**        comp
14d30 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65  ound clause made
14d40 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20   up entirely of 
14d50 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
14d60 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20  eries, and .**  
14d70 20 20 20 20 20 20 74 68 65 20 70 61 72 65 6e 74        the parent
14d80 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
14d90 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
14da0 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61  itself part of a
14db0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
14dc0 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  ,.**          * 
14dd0 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
14de0 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20  ate or DISTINCT 
14df0 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20  query, and.**   
14e00 20 20 20 20 20 20 20 2a 20 68 61 73 20 6e 6f 20         * has no 
14e10 6f 74 68 65 72 20 74 61 62 6c 65 73 20 6f 72 20  other tables or 
14e20 73 75 62 2d 73 65 6c 65 63 74 73 20 69 6e 20 74  sub-selects in t
14e30 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
14e40 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  **.**        The
14e50 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d   parent and sub-
14e60 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69  query may contai
14e70 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  n WHERE clauses.
14e80 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20   Subject to.**  
14e90 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29        rules (11)
14ea0 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c  , (13) and (14),
14eb0 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63   they may also c
14ec0 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c  ontain ORDER BY,
14ed0 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54  .**        LIMIT
14ee0 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
14ef0 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  ses..**.**  (18)
14f00 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
14f10 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
14f20 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
14f30 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
14f40 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 62  *        ORDER b
14f50 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  y clause of the 
14f60 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
14f70 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
14f80 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
14f90 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
14fa0 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
14fb0 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75 65  (19)  The subque
14fc0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
14fd0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
14fe0 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
14ff0 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65  t.**        have
15000 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
15010 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
15020 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
15030 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
15040 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
15050 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
15060 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
15070 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
15080 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
15090 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
150a0 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
150b0 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65  gates and subque
150c0 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20  ryIsAgg is true 
150d0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
150e0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
150f0 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
15100 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
15110 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
15120 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
15130 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
15140 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
15150 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
15160 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
15170 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
15180 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
15190 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
151a0 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
151b0 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
151c0 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
151d0 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
151e0 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
151f0 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
15200 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
15210 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
15220 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
15230 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
15240 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
15250 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
15260 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
15270 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
15280 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
15290 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
152a0 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
152b0 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
152c0 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20  .  int isAgg,   
152d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
152e0 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
152f0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
15300 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
15310 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  t subqueryIsAgg 
15320 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
15330 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
15340 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
15350 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ons */.){.  cons
15360 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
15370 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
15380 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
15390 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72  ;.  Select *pPar
153a0 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ent;.  Select *p
153b0 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
153c0 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
153d0 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
153e0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20   Select *pSub1; 
153f0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
15400 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  to the rightmost
15410 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71   select in sub-q
15420 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
15430 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
15440 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
15450 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
15460 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
15470 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
15480 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
15490 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
154a0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
154b0 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
154c0 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
154d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
154e0 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
154f0 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
15500 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
15510 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
15520 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
15530 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
15540 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
15550 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
15560 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15580 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
15590 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
155a0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
155b0 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
155c0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  ubquery */.  sql
155d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
155e0 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65  e->db;..  /* Che
155f0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
15600 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
15610 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
15620 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 69  if not..  */.  i
15630 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
15640 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
15650 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
15660 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
15670 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
15680 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
15690 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
156a0 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
156b0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
156c0 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
156d0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
156e0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
156f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41 67  =0 );.  if( isAg
15700 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41  g && subqueryIsA
15710 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  gg ) return 0;  
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15730 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
15740 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62 71  )  */.  if( subq
15750 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53 72  ueryIsAgg && pSr
15760 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75  c->nSrc>1 ) retu
15770 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
15780 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
15790 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63 20  )  */.  pSubSrc 
157a0 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20  = pSub->pSrc;.  
157b0 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63 20  assert( pSubSrc 
157c0 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f  );.  /* Prior to
157d0 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20   version 3.1.2, 
157e0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
157f0 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65 20  FFSET had to be 
15800 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73  simple constants
15810 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74  ,.  ** not arbit
15820 72 61 72 79 20 65 78 70 72 65 73 73 73 69 6f 6e  rary expresssion
15830 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f  s, we allowed so
15840 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20  me combining of 
15850 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
15860 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68  .  ** because th
15870 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70  ey could be comp
15880 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  uted at compile-
15890 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e 20  time.  But when 
158a0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
158b0 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72 62  .  ** became arb
158c0 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
158d0 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72 63  ns, we were forc
158e0 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72 69  ed to add restri
158f0 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a  ctions (13).  **
15900 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20   and (14). */.  
15910 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
15920 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20   && p->pLimit ) 
15930 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
15940 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
15950 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20  ction (13) */.  
15960 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73 65  if( pSub->pOffse
15970 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
15980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15990 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
159a0 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20  ction (14) */.  
159b0 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
159c0 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69  t && pSub->pLimi
159d0 74 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  t && pSub->pOrde
159e0 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rBy ){.    retur
159f0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
15a30 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  15) */.  }.  if(
15a40 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
15a50 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
15a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a70 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
15a80 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28  on (7)  */.  if(
15a90 20 28 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67   ((pSub->selFlag
15aa0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
15ab0 21 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 4c 69  !=0 || pSub->pLi
15ac0 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20 20 26  mit) .         &
15ad0 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  & (pSrc->nSrc>1 
15ae0 7c 7c 20 69 73 41 67 67 29 20 29 7b 20 20 20 20  || isAgg) ){    
15af0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
15b00 74 69 6f 6e 73 20 28 34 29 28 35 29 28 38 29 28  tions (4)(5)(8)(
15b10 39 29 20 2a 2f 0a 20 20 20 20 20 72 65 74 75 72  9) */.     retur
15b20 6e 20 30 3b 20 20 20 20 20 20 20 0a 20 20 7d 0a  n 0;       .  }.
15b30 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
15b40 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
15b50 29 21 3d 30 20 26 26 20 73 75 62 71 75 65 72 79  )!=0 && subquery
15b60 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72 65  IsAgg ){.     re
15b70 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
15b80 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
15b90 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  6)  */.  }.  if(
15ba0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20   p->pOrderBy && 
15bb0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
15bc0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
15c00 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20 2a  striction (11) *
15c10 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41 67  /.  }.  if( isAg
15c20 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65  g && pSub->pOrde
15c30 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 20  rBy ) return 0; 
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15c50 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
15c60 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  6) */.  if( pSub
15c70 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
15c80 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
15c90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
15ca0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
15cb0 39 29 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53 4f  9) */..  /* OBSO
15cc0 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a  LETE COMMENT 1:.
15cd0 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    ** Restriction
15ce0 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71   3:  If the subq
15cf0 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20  uery is a join, 
15d00 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
15d10 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20  bquery is .  ** 
15d20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20  not used as the 
15d30 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
15d40 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20   an outer join. 
15d50 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79   Examples of why
15d60 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f   this.  ** is no
15d70 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
15d80 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
15d90 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
15da0 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a  (t2 JOIN t3).  *
15db0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
15dc0 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
15dd0 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
15de0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
15df0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
15e00 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20  IN t2) JOIN t3. 
15e10 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69   **.  ** which i
15e20 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65  s not at all the
15e30 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a   same thing..  *
15e40 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20  *.  ** OBSOLETE 
15e50 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20  COMMENT 2:.  ** 
15e60 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20  Restriction 12: 
15e70 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
15e80 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
15e90 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20  erand of a left 
15ea0 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c  outer.  ** join,
15eb0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
15ec0 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57  ubquery has no W
15ed0 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a  HERE clause..  *
15ee0 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66  * An examples of
15ef0 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74   why this is not
15f00 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
15f10 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
15f20 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
15f30 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
15f40 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20   WHERE t2.x>0). 
15f50 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
15f60 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
15f70 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
15f80 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
15f90 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
15fa0 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74  JOIN t2) WHERE t
15fb0 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  2.x>0.  **.  ** 
15fc0 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74  But the t2.x>0 t
15fd0 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  est will always 
15fe0 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72  fail on a NULL r
15ff0 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a  ow of t2, which.
16000 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79    ** effectively
16010 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55   converts the OU
16020 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e  TER JOIN into an
16030 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a   INNER JOIN..  *
16040 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52  *.  ** THIS OVER
16050 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43  RIDES OBSOLETE C
16060 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20  OMMENTS 1 AND 2 
16070 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b  ABOVE:.  ** Tick
16080 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74  et #3300 shows t
16090 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  hat flattening t
160a0 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
160b0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a   a LEFT JOIN.  *
160c0 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74  * is fraught wit
160d0 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20  h danger.  Best 
160e0 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f  to avoid the who
160f0 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68  le thing.  If th
16100 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
16110 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72  is the right ter
16120 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  m of a LEFT JOIN
16130 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c  , then do not fl
16140 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  atten..  */.  if
16150 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69  ( (pSubitem->joi
16160 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
16170 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
16180 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
16190 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20  Restriction 17: 
161a0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
161b0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
161c0 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d  ELECT, then it m
161d0 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c  ust.  ** use onl
161e0 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  y the UNION ALL 
161f0 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f  operator. And no
16200 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65  ne of the simple
16210 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a   select queries.
16220 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75    ** that make u
16230 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53  p the compound S
16240 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65  ELECT are allowe
16250 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74  d to be aggregat
16260 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20  e or distinct.  
16270 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ** queries..  */
16280 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72  .  if( pSub->pPr
16290 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ior ){.    if( p
162a0 2d 3e 70 50 72 69 6f 72 20 7c 7c 20 69 73 41 67  ->pPrior || isAg
162b0 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67  g || (p->selFlag
162c0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
162d0 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72  !=0 || pSrc->nSr
162e0 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=1 ){.      re
162f0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
16300 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62    for(pSub1=pSub
16310 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70  ; pSub1; pSub1=p
16320 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Sub1->pPrior){. 
16330 20 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d       if( (pSub1-
16340 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
16350 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
16360 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20  egate))!=0.     
16370 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72    || (pSub1->pPr
16380 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70  ior && pSub1->op
16390 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20  !=TK_ALL) .     
163a0 20 20 7c 7c 20 21 70 53 75 62 31 2d 3e 70 53 72    || !pSub1->pSr
163b0 63 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63  c || pSub1->pSrc
163c0 2d 3e 6e 53 72 63 21 3d 31 0a 20 20 20 20 20 20  ->nSrc!=1.      
163d0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
163e0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
163f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72   }..    /* Restr
16400 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20  iction 18. */.  
16410 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
16420 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  y ){.      int i
16430 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  i;.      for(ii=
16440 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42  0; ii<p->pOrderB
16450 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  y->nExpr; ii++){
16460 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
16470 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e  pOrderBy->a[ii].
16480 69 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  iCol==0 ) return
16490 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
164a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20  }.  }..  /***** 
164b0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
164c0 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69   point, flatteni
164d0 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
164e0 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75   *****/..  /* Au
164f0 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71  thorize the subq
16500 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65  uery */.  pParse
16510 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
16520 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
16530 3b 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68 43  ;.  sqlite3AuthC
16540 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
16550 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
16560 2c 20 30 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  , 0);.  pParse->
16570 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
16580 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
16590 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
165a0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
165b0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
165c0 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62  atement, then (b
165d0 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20  y restrictions. 
165e0 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62   ** 17 and 18 ab
165f0 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20  ove) it must be 
16600 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20  a UNION ALL and 
16610 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
16620 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f   must .  ** be o
16630 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
16640 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
16650 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f   <expr-list> FRO
16660 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20  M (<sub-query>) 
16670 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a  <where-clause> .
16680 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77    **.  ** follow
16690 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20  ed by any ORDER 
166a0 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72  BY, LIMIT and/or
166b0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
166c0 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a   This block.  **
166d0 20 63 72 65 61 74 65 73 20 4e 20 63 6f 70 69 65   creates N copie
166e0 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  s of the parent 
166f0 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e  query without an
16700 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
16710 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45  T or .  ** OFFSE
16720 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f  T clauses and jo
16730 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20  ins them to the 
16740 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f  left-hand-side o
16750 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  f the original. 
16760 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20   ** using UNION 
16770 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49  ALL operators. I
16780 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73  n this case N is
16790 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
167a0 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63  imple.  ** selec
167b0 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  t statements in 
167c0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62  the compound sub
167d0 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  -query..  */.  f
167e0 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  or(pSub=pSub->pP
167f0 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62  rior; pSub; pSub
16800 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
16810 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
16820 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
16830 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
16840 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72  rderBy;.    Expr
16850 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c   *pLimit = p->pL
16860 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a  imit;.    Expr *
16870 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
16880 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  fset;.    Select
16890 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
168a0 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rior;.    p->pOr
168b0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
168c0 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
168d0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
168e0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
168f0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
16900 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
16910 2c 20 70 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  , p);.    pNew->
16920 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
16930 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
16940 20 70 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 70 4f   pNew;.    p->pO
16950 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
16960 79 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  y;.    p->op = T
16970 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70 53  K_ALL;.    p->pS
16980 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70  rc = pSrc;.    p
16990 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
169a0 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  t;.    p->pOffse
169b0 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
169c0 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d   p->pRightmost =
169d0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 52   0;.    pNew->pR
169e0 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20  ightmost = 0;.  
169f0 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
16a00 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
16a10 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
16a20 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
16a30 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
16a40 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
16a50 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
16a60 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
16a70 3b 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d  ;.  for(pParent=
16a80 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72  p; pParent; pPar
16a90 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72  ent=pParent->pPr
16aa0 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e  ior, pSub=pSub->
16ab0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74  pPrior){.    int
16ac0 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53   nSubSrc = pSubS
16ad0 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 69 6e  rc->nSrc;.    in
16ae0 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  t jointype = 0;.
16af0 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53      pSubSrc = pS
16b00 75 62 2d 3e 70 53 72 63 3b 0a 20 20 20 20 70 53  ub->pSrc;.    pS
16b10 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
16b20 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 4d 6f 76 65  rc;..    /* Move
16b30 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d   all of the FROM
16b40 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
16b50 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
16b60 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 46 52  he.    ** the FR
16b70 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
16b80 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
16b90 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
16ba0 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 20 20 2a  , remember.    *
16bb0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  * the cursor num
16bc0 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ber for the orig
16bd0 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79  inal outer query
16be0 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e   FROM element in
16bf0 0a 20 20 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  .    ** iParent.
16c00 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
16c10 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
16c20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
16c30 75 65 6e 74 20 63 6f 64 65 0a 20 20 20 20 2a 2a  uent code.    **
16c40 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
16c50 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
16c60 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
16c70 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
16c80 65 0a 20 20 20 20 2a 2a 20 74 68 6f 73 65 20 72  e.    ** those r
16c90 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65  eferences with e
16ca0 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
16cb0 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73  resolve to the s
16cc0 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 20  ubquery FROM.   
16cd0 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20   ** elements we 
16ce0 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20  are now copying 
16cf0 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  in..    */.    i
16d00 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20  f( pSrc ){.     
16d10 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72   pSubitem = &pSr
16d20 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 20  c->a[iFrom];.   
16d30 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75     nSubSrc = pSu
16d40 62 53 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20  bSrc->nSrc;.    
16d50 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75    jointype = pSu
16d60 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b  bitem->jointype;
16d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
16d80 6c 65 74 65 54 61 62 6c 65 28 70 53 75 62 69 74  leteTable(pSubit
16d90 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 20  em->pTab);.     
16da0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16db0 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  b, pSubitem->zDa
16dc0 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20 73  tabase);.      s
16dd0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16de0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
16df0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16e00 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
16e10 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
16e20 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54      pSubitem->pT
16e30 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ab = 0;.      pS
16e40 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
16e50 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 75  e = 0;.      pSu
16e60 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30  bitem->zName = 0
16e70 3b 0a 20 20 20 20 20 20 70 53 75 62 69 74 65 6d  ;.      pSubitem
16e80 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
16e90 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 75 62    }.    if( nSub
16ea0 53 72 63 21 3d 31 20 7c 7c 20 21 70 53 72 63 20  Src!=1 || !pSrc 
16eb0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 74  ){.      int ext
16ec0 72 61 20 3d 20 6e 53 75 62 53 72 63 20 2d 20 31  ra = nSubSrc - 1
16ed0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 28 70  ;.      for(i=(p
16ee0 53 72 63 3f 31 3a 30 29 3b 20 69 3c 6e 53 75 62  Src?1:0); i<nSub
16ef0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
16f00 20 20 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65     pSrc = sqlite
16f10 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64  3SrcListAppend(d
16f20 62 2c 20 70 53 72 63 2c 20 30 2c 20 30 29 3b 0a  b, pSrc, 0, 0);.
16f30 20 20 20 20 20 20 20 20 69 66 28 20 70 53 72 63          if( pSrc
16f40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
16f50 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
16f60 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   0;.          re
16f70 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
16f80 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
16f90 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
16fa0 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28  pSrc;.      for(
16fb0 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
16fc0 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f 6d 3b 20  i-extra>=iFrom; 
16fd0 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i--){.        pS
16fe0 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53 72 63 2d  rc->a[i] = pSrc-
16ff0 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a 20 20 20  >a[i-extra];.   
17000 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
17010 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
17020 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  c; i++){.      p
17030 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
17040 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
17050 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
17060 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c  SubSrc->a[i], 0,
17070 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d   sizeof(pSubSrc-
17080 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  >a[i]));.    }. 
17090 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d     pSrc->a[iFrom
170a0 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
170b0 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
170c0 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
170d0 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
170e0 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
170f0 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
17100 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
17110 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
17120 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17130 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
17140 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
17150 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
17160 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
17170 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
17180 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
17190 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
171a0 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
171b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
171c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
171d0 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
171e0 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
171f0 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
17200 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
17210 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
17220 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
17230 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
17240 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
17250 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
17260 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
17270 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
17280 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
17290 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
172a0 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
172b0 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
172c0 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
172d0 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
172e0 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20     */.    pList 
172f0 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  = pParent->pELis
17300 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
17310 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
17320 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
17330 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69   *pExpr;.      i
17340 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
17350 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70  Name==0 && (pExp
17360 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
17370 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d  pExpr)->span.z!=
17380 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  0 ){.        pLi
17390 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
173a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
173b0 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
173c0 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78  p(db, (char*)pEx
173d0 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70  pr->span.z, pExp
173e0 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  r->span.n);.    
173f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75    }.    }.    su
17400 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
17410 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c  pParent->pEList,
17420 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
17430 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
17440 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20   isAgg ){.      
17450 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
17460 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75  , pParent->pGrou
17470 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  pBy, iParent, pS
17480 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
17490 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
174a0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
174b0 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
174c0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
174d0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
174e0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
174f0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
17500 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
17510 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
17520 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
17530 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
17540 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
17550 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
17560 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  f( pParent->pOrd
17570 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 75  erBy ){.      su
17580 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
17590 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
175a0 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
175b0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
175c0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
175d0 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70  Where ){.      p
175e0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
175f0 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
17600 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65  >pWhere);.    }e
17610 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72  lse{.      pWher
17620 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
17630 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
17640 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gg ){.      asse
17650 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  rt( pParent->pHa
17660 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ving==0 );.     
17670 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
17680 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  g = pParent->pWh
17690 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
176a0 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  nt->pWhere = pWh
176b0 65 72 65 3b 0a 20 20 20 20 20 20 73 75 62 73 74  ere;.      subst
176c0 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
176d0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
176e0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
176f0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
17700 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
17710 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
17720 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
17730 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17750 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
17760 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
17770 76 69 6e 67 29 29 3b 0a 20 20 20 20 20 20 61 73  ving));.      as
17780 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
17790 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
177a0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72      pParent->pGr
177b0 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
177c0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
177d0 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  Sub->pGroupBy);.
177e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
177f0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
17800 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20  Parent->pWhere, 
17810 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
17820 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  EList);.      pP
17830 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
17840 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
17850 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  b, pParent->pWhe
17860 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20  re, pWhere);.   
17870 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65   }.  .    /* The
17880 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
17890 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
178a0 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
178b0 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
178c0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
178d0 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a  stinct. .    */.
178e0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c      pParent->sel
178f0 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73  Flags |= pSub->s
17900 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
17910 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a  tinct;.  .    /*
17920 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e  .    ** SELECT .
17930 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .. FROM (SELECT 
17940 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53  ... LIMIT a OFFS
17950 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46  ET b) LIMIT x OF
17960 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20  FSET y;.    **. 
17970 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d     ** One is tem
17980 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61  pted to try to a
17990 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f  dd a and b to co
179a0 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73  mbine the limits
179b0 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20  .  But this.    
179c0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ** does not work
179d0 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74   if either limit
179e0 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20   is negative..  
179f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
17a00 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
17a10 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d     pParent->pLim
17a20 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69  it = pSub->pLimi
17a30 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  t;.      pSub->p
17a40 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Limit = 0;.    }
17a50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61  .  }..  /* Finia
17a60 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74  lly, delete what
17a70 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20   is left of the 
17a80 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74  subquery and ret
17a90 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  urn.  ** success
17aa0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
17ab0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
17ac0 20 70 53 75 62 31 29 3b 0a 0a 20 20 72 65 74 75   pSub1);..  retu
17ad0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
17ae0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
17af0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
17b00 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
17b10 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
17b20 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  /../*.** Analyze
17b30 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
17b40 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
17b50 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  an argument to s
17b60 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61  ee if it.** is a
17b70 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
17b80 71 75 65 72 79 2e 20 52 65 74 75 72 6e 20 57 48  query. Return WH
17b90 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
17ba0 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
17bb0 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74 20 69  _MAX if .** it i
17bc0 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73  s, or 0 otherwis
17bd0 65 2e 20 41 74 20 70 72 65 73 65 6e 74 2c 20 61  e. At present, a
17be0 20 71 75 65 72 79 20 69 73 20 63 6f 6e 73 69 64   query is consid
17bf0 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20  ered to be.** a 
17c00 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71 75 65 72  min()/max() quer
17c10 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  y if:.**.**   1.
17c20 20 54 68 65 72 65 20 69 73 20 61 20 73 69 6e 67   There is a sing
17c30 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  le object in the
17c40 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
17c50 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72 65 20 69  .**   2. There i
17c60 73 20 61 20 73 69 6e 67 6c 65 20 65 78 70 72 65  s a single expre
17c70 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73  ssion in the res
17c80 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 69 74 20  ult set, and it 
17c90 69 73 0a 2a 2a 20 20 20 20 20 20 65 69 74 68 65  is.**      eithe
17ca0 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61 78 28  r min(x) or max(
17cb0 78 29 2c 20 77 68 65 72 65 20 78 20 69 73 20 61  x), where x is a
17cc0 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63   column referenc
17cd0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17ce0 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 50 61 72   minMaxQuery(Par
17cf0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
17d00 63 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a  ct *p){.  Expr *
17d10 70 45 78 70 72 3b 0a 20 20 45 78 70 72 4c 69 73  pExpr;.  ExprLis
17d20 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  t *pEList = p->p
17d30 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  EList;..  if( pE
17d40 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
17d50 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
17d60 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
17d70 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  pExpr = pEList->
17d80 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 70 45  a[0].pExpr;.  pE
17d90 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
17da0 69 73 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ist;.  if( pExpr
17db0 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
17dc0 43 54 49 4f 4e 20 7c 7c 20 70 45 4c 69 73 74 3d  CTION || pEList=
17dd0 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45  =0 || pEList->nE
17de0 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
17df0 30 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  0;.  if( pEList-
17e00 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21  >a[0].pExpr->op!
17e10 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
17e20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
17e30 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
17e40 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
17e50 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20 57  .n!=3 ) return W
17e60 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
17e70 4d 41 4c 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  MAL;.  if( sqlit
17e80 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
17e90 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
17ea0 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"min",3)==0 ){.
17eb0 20 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45      return WHERE
17ec0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20  _ORDERBY_MIN;.  
17ed0 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
17ee0 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
17ef0 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
17f00 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "max",3)==0 ){. 
17f10 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f     return WHERE_
17f20 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d  ORDERBY_MAX;.  }
17f30 0a 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f  .  return WHERE_
17f40 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
17f50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
17f60 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65  utine is a Walke
17f70 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22  r callback for "
17f80 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c  expanding" a SEL
17f90 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
17fa0 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65  * "Expanding" me
17fb0 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f  ans to do the fo
17fc0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
17fd0 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
17fe0 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
17ff0 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
18000 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
18010 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
18020 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
18030 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
18040 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
18050 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
18060 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
18070 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
18080 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
18090 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
180a0 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
180b0 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
180c0 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
180d0 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
180e0 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
180f0 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
18100 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18110 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
18120 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
18130 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
18140 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
18150 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
18160 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
18170 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
18180 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
18190 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
181a0 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
181b0 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
181c0 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
181d0 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65   up the presiste
181e0 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
181f0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
18200 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
18210 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
18220 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
18230 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64  lause to accomod
18240 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
18250 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
18260 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
18270 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
18280 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
18290 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
182a0 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
182b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
182c0 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
182d0 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
182e0 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
182f0 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
18300 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
18310 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
18320 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
18330 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
18340 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
18350 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
18360 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
18370 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
18380 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
18390 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
183a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
183b0 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c  lectExpander(Wal
183c0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
183d0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
183e0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
183f0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
18400 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72  nt i, j, k;.  Sr
18410 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
18420 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
18430 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
18440 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
18450 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
18460 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
18470 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
18480 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72  Failed  ){.    r
18490 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
184a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 53  .  }.  if( p->pS
184b0 72 63 3d 3d 30 20 7c 7c 20 28 70 2d 3e 73 65 6c  rc==0 || (p->sel
184c0 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e  Flags & SF_Expan
184d0 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ded)!=0 ){.    r
184e0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
184f0 0a 20 20 7d 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  .  }.  p->selFla
18500 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65  gs |= SF_Expande
18510 64 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  d;.  pTabList = 
18520 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
18530 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a  t = p->pEList;..
18540 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63    /* Make sure c
18550 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61  ursor numbers ha
18560 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64  ve been assigned
18570 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   to all entries 
18580 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d  in.  ** the FROM
18590 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53   clause of the S
185a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
185b0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
185c0 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
185d0 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ors(pParse, pTab
185e0 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  List);..  /* Loo
185f0 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65  k up every table
18600 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
18610 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
18620 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a   select.  If.  *
18630 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  * an entry of th
18640 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
18650 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74   a subquery inst
18660 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ead of a table o
18670 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65  r view,.  ** the
18680 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73  n create a trans
18690 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63  ient table struc
186a0 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65  ture to describe
186b0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
186c0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
186d0 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
186e0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
186f0 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
18700 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
18710 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  ab;.    if( pFro
18720 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20  m->pTab!=0 ){.  
18730 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61 74      /* This stat
18740 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61 64  ement has alread
18750 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e  y been prepared.
18760 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
18770 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 67  ed.      ** to g
18780 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20  o further. */.  
18790 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 30      assert( i==0
187a0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
187b0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
187c0 7d 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  }.    if( pFrom-
187d0 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
187e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
187f0 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
18800 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
18810 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
18820 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
18830 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
18840 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
18850 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
18860 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
18870 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
18880 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
18890 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
188a0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
188b0 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70 46 72  pSel);.      pFr
188c0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
188d0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
188e0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
188f0 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  (Table));.      
18900 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
18910 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
18920 20 20 20 20 20 20 70 54 61 62 2d 3e 64 62 20 3d        pTab->db =
18930 20 64 62 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   db;.      pTab-
18940 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
18950 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
18960 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
18970 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65  , "sqlite_subque
18980 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29  ry_%p_", (void*)
18990 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69  pTab);.      whi
189a0 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
189b0 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
189c0 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20  >pPrior; }.     
189d0 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
189e0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
189f0 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c  e, pSel->pEList,
18a00 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
18a10 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
18a20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
18a30 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  -1;.      pTab->
18a40 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
18a50 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
18a60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18a70 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
18a80 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
18a90 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
18aa0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
18ab0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
18ac0 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
18ad0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
18ae0 61 62 20 3d 20 0a 20 20 20 20 20 20 20 20 73 71  ab = .        sq
18af0 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
18b00 28 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2d  (pParse,0,pFrom-
18b10 3e 7a 4e 61 6d 65 2c 70 46 72 6f 6d 2d 3e 7a 44  >zName,pFrom->zD
18b20 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 20 20  atabase);.      
18b30 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
18b40 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
18b50 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
18b60 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ++;.#if !defined
18b70 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
18b80 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28  W) || !defined (
18b90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
18ba0 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20  UALTABLE).      
18bb0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
18bc0 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70  t || IsVirtual(p
18bd0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
18be0 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65 72 65  /* We reach here
18bf0 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
18c00 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20  ble is a really 
18c10 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  a view */.      
18c20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65    if( sqlite3Vie
18c30 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
18c40 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20  pParse, pTab) ) 
18c50 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
18c60 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;..        /* If
18c70 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 21   pFrom->pSelect!
18c80 3d 30 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  =0 it means we a
18c90 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
18ca0 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 69 65  a.        ** vie
18cb0 77 20 77 69 74 68 69 6e 20 61 20 76 69 65 77 2e  w within a view.
18cc0 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 72    The SELECT str
18cd0 75 63 74 75 72 65 20 68 61 73 20 61 6c 72 65 61  ucture has alrea
18ce0 64 79 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  dy been.        
18cf0 2a 2a 20 63 6f 70 69 65 64 20 62 79 20 74 68 65  ** copied by the
18d00 20 6f 75 74 65 72 20 76 69 65 77 20 73 6f 20 77   outer view so w
18d10 65 20 63 61 6e 20 73 6b 69 70 20 74 68 65 20 63  e can skip the c
18d20 6f 70 79 20 73 74 65 70 20 68 65 72 65 0a 20 20  opy step here.  
18d30 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
18d40 69 6e 6e 65 72 20 76 69 65 77 2e 0a 20 20 20 20  inner view..    
18d50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
18d60 66 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  f( pFrom->pSelec
18d70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
18d80 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
18d90 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
18da0 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  Dup(db, pTab->pS
18db0 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
18dc0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
18dd0 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  ect(pWalker, pFr
18de0 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
18df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18e00 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
18e10 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
18e20 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
18e30 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
18e40 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
18e50 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ns..  */.  if( d
18e60 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18e70 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  || sqliteProcess
18e80 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
18e90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
18ea0 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
18eb0 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
18ec0 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
18ed0 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
18ee0 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
18ef0 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
18f00 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
18f10 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76  les.  And for ev
18f20 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65  ery TABLE.* inse
18f30 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a  rt the names.  *
18f40 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  * of all columns
18f50 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20   in TABLE.  The 
18f60 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20  parser inserted 
18f70 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
18f80 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74  sion.  ** with t
18f90 68 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74  he TK_ALL operat
18fa0 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
18fb0 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
18fc0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   the column list
18fd0 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  ** The follo
18fe0 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
18ff0 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
19000 20 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69   TK_ALL expressi
19010 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20  ons and expand. 
19020 20 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20   ** each one to 
19030 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
19040 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74  columns in all t
19050 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
19060 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   The first loop 
19070 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73  just checks to s
19080 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
19090 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  any "*" operator
190a0 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64  s.  ** that need
190b0 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f   expanding..  */
190c0 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45  .  for(k=0; k<pE
190d0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
190e0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
190f0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70  = pEList->a[k].p
19100 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
19110 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
19120 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 45  reak;.    if( pE
19130 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
19140 70 45 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45  pE->pRight && pE
19150 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
19160 5f 41 4c 4c 0a 20 20 20 20 20 20 20 20 20 26 26  _ALL.         &&
19170 20 70 45 2d 3e 70 4c 65 66 74 20 26 26 20 70 45   pE->pLeft && pE
19180 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
19190 49 44 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ID ) break;.  }.
191a0 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e    if( k<pEList->
191b0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a  nExpr ){.    /*.
191c0 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74      ** If we get
191d0 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74   here it means t
191e0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  he result set co
191f0 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
19200 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70  re "*".    ** op
19210 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65  erators that nee
19220 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
19230 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  .  Loop through 
19240 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a  each expression.
19250 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65      ** in the re
19260 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70  sult set and exp
19270 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20  and them one by 
19280 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  one..    */.    
19290 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
192a0 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74  item *a = pEList
192b0 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ->a;.    ExprLis
192c0 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20  t *pNew = 0;.   
192d0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61   int flags = pPa
192e0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a  rse->db->flags;.
192f0 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65      int longName
19300 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c  s = (flags & SQL
19310 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
19320 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
19330 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 66             && (f
19340 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
19350 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b  ortColNames)==0;
19360 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b  ..    for(k=0; k
19370 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
19380 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  k++){.      Expr
19390 20 2a 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70   *pE = a[k].pExp
193a0 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  r;.      if( pE-
193b0 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20  >op!=TK_ALL &&. 
193c0 20 20 20 20 20 20 20 20 20 20 28 70 45 2d 3e 6f            (pE->o
193d0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
193e0 3e 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45  >pRight==0 || pE
193f0 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  ->pRight->op!=TK
19400 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
19410 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
19420 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
19430 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
19440 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
19450 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
19460 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
19470 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
19480 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
19490 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
194a0 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
194b0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61           pNew->a
194c0 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e  [pNew->nExpr-1].
194d0 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61  zName = a[k].zNa
194e0 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  me;.        }.  
194f0 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72        a[k].pExpr
19500 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 5b   = 0;.        a[
19510 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  k].zName = 0;.  
19520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19530 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
19540 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
19550 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
19560 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
19570 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
19580 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
19590 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
195a0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
195b0 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
195c0 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
195d0 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20  char *zTName;   
195e0 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74           /* text
195f0 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c   of name of TABL
19600 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  E */.        if(
19610 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
19620 26 26 20 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a  && pE->pLeft ){.
19630 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
19640 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
19650 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d  omToken(db, &pE-
19660 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a  >pLeft->token);.
19670 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
19680 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
19690 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
196a0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
196b0 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
196c0 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
196d0 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
196e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61  +){.          Ta
196f0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
19700 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
19710 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
19720 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
19730 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
19740 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20   zTabName==0 || 
19750 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29  zTabName[0]==0 )
19760 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  { .            z
19770 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
19780 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
19790 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
197a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
197b0 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
197c0 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
197d0 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
197e0 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
197f0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
19800 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
19810 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19820 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
19830 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 1;.          f
19840 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
19850 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
19860 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
19870 78 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20  xpr, *pRight;.  
19880 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
19890 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
198a0 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20  ol[j].zName;..  
198b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
198c0 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b  a column is mark
198d0 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 20 28  ed as 'hidden' (
198e0 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70  currently only p
198f0 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
19900 20 20 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75      ** for virtu
19910 61 6c 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e  al tables), do n
19920 6f 74 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e  ot include it in
19930 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20   the expanded.  
19940 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73            ** res
19950 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20  ult-set list..  
19960 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
19970 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73 48           if( IsH
19980 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
19990 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20  b->aCol[j]) ){. 
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
199b0 65 72 74 28 49 73 56 69 72 74 75 61 6c 28 70 54  ert(IsVirtual(pT
199c0 61 62 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ab));.          
199d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
199e0 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
199f0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
19a00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19a10 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
19a20 5f 69 74 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26  _item *pLeft = &
19a30 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d  pTabList->a[i-1]
19a40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19a50 69 66 28 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f  if( (pLeft[1].jo
19a60 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
19a70 52 41 4c 29 21 3d 30 20 26 26 0a 20 20 20 20 20  RAL)!=0 &&.     
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a90 20 20 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70     columnIndex(p
19aa0 4c 65 66 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d  Left->pTab, zNam
19ab0 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
19ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
19ad0 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f   NATURAL join, o
19ae0 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c  mit the join col
19af0 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20  umns from the . 
19b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
19b10 2a 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72  * table on the r
19b20 69 67 68 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  ight */.        
19b30 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
19b40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19b50 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
19b60 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73  if( sqlite3IdLis
19b70 74 49 6e 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e  tIndex(pLeft[1].
19b80 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d  pUsing, zName)>=
19b90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
19ba0 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69       /* In a joi
19bb0 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63  n with a USING c
19bc0 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75  lause, omit colu
19bd0 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20  mns in the.     
19be0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
19bf0 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20  ing clause from 
19c00 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
19c10 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20   right. */.     
19c20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
19c30 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
19c40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
19c50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
19c60 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 50  Right = sqlite3P
19c70 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
19c80 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ID, 0, 0, 0);.  
19c90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
19ca0 69 67 68 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ight==0 ) break;
19cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
19cc0 51 75 6f 74 65 64 54 6f 6b 65 6e 28 70 50 61 72  QuotedToken(pPar
19cd0 73 65 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b  se, &pRight->tok
19ce0 65 6e 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  en, zName);.    
19cf0 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
19d00 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73  Names || pTabLis
19d10 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20  t->nSrc>1 ){.   
19d20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
19d30 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  *pLeft = sqlite3
19d40 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
19d50 5f 49 44 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  _ID, 0, 0, 0);. 
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
19d70 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
19d80 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
19d90 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
19da0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
19db0 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20     if( pExpr==0 
19dc0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
19dd0 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65 64         setQuoted
19de0 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70  Token(pParse, &p
19df0 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61  Left->token, zTa
19e00 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
19e10 20 20 20 20 20 20 73 65 74 54 6f 6b 65 6e 28 26        setToken(&
19e20 70 45 78 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20  pExpr->span, .  
19e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e40 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
19e50 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
19e60 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20  Name, zName));. 
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
19e80 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31  pr->span.dyn = 1
19e90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19ea0 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d  pExpr->token.z =
19eb0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
19ec0 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e    pExpr->token.n
19ed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
19ee0 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
19ef0 2e 64 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  .dyn = 0;.      
19f00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19f10 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
19f20 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
19f30 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
19f40 73 70 61 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f  span = pExpr->to
19f50 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ken;.           
19f60 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64     pExpr->span.d
19f70 79 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  yn = 0;.        
19f80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19f90 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
19fa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
19fb0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
19fc0 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
19fd0 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70  arse, pNew, pExp
19fe0 72 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29  r, &pExpr->span)
19ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
1a000 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1a010 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1a020 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1a030 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45  pParse, pNew, pE
1a040 78 70 72 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f  xpr, &pRight->to
1a050 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ken);.          
1a060 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
1a070 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a080 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e    if( !tableSeen
1a090 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1a0a0 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( zTName ){.    
1a0b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a0c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1a0d0 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
1a0e0 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  %s", zTName);.  
1a0f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1a100 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1a110 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1a120 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  e, "no tables sp
1a130 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  ecified");.     
1a140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1a150 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a160 44 62 46 72 65 65 28 64 62 2c 20 7a 54 4e 61 6d  DbFree(db, zTNam
1a170 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1a180 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
1a190 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
1a1a0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e  pEList);.    p->
1a1b0 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  pEList = pNew;. 
1a1c0 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
1a1d0 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
1a1e0 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70  ->pEList && p->p
1a1f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d  EList->nExpr>db-
1a200 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
1a210 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
1a220 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1a230 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
1a240 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
1a250 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20   result set");. 
1a260 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
1a270 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1a280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
1a290 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
1a2a0 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
1a2b0 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
1a2c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
1a2d0 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  e Walker.xExprCa
1a2e0 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72  llback then expr
1a2f0 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20  ession trees.** 
1a300 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f  are walked witho
1a310 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62  ut any actions b
1a320 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61  eing taken at ea
1a330 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d  ch node.  Presum
1a340 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68  ably,.** when th
1a350 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1a360 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45  ed for Walker.xE
1a370 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
1a380 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c   .** Walker.xSel
1a390 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73  ectCallback is s
1a3a0 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  et to do somethi
1a3b0 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76  ng useful for ev
1a3c0 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79  ery .** subquery
1a3d0 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74   in the parser t
1a3e0 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
1a3f0 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28  nt exprWalkNoop(
1a400 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
1a410 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
1a420 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1a430 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
1a440 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
1a450 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
1a460 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
1a470 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
1a480 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
1a490 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
1a4a0 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
1a4b0 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
1a4c0 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
1a4d0 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
1a4e0 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
1a4f0 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
1a500 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
1a510 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
1a520 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1a530 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
1a540 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
1a550 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
1a560 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
1a570 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1a580 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
1a590 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
1a5a0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
1a5b0 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
1a5c0 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
1a5d0 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
1a5e0 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
1a5f0 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
1a600 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
1a610 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
1a620 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
1a630 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
1a640 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
1a650 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
1a660 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
1a670 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
1a680 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
1a690 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
1a6a0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
1a6b0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
1a6c0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
1a6d0 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e  ck = selectExpan
1a6e0 64 65 72 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  der;.  w.xExprCa
1a6f0 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
1a700 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
1a710 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
1a720 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1a730 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a  &w, pSelect);.}.
1a740 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1a750 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
1a760 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57  *.** This is a W
1a770 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
1a780 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66  lback callback f
1a790 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65  or the sqlite3Se
1a7a0 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a  lectTypeInfo().*
1a7b0 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  * interface..**.
1a7c0 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d  ** For each FROM
1a7d0 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
1a7e0 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79  , add Column.zTy
1a7f0 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43  pe and Column.zC
1a800 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  oll.** informati
1a810 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  on to the Table 
1a820 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
1a830 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
1a840 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74  sult set.** of t
1a850 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a  hat subquery..**
1a860 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
1a870 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
1a880 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
1a890 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74  lt set was const
1a8a0 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c  ructed.** by sel
1a8b0 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75  ectExpander() bu
1a8c0 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63  t the type and c
1a8d0 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  ollation informa
1a8e0 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64  tion was omitted
1a8f0 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e  .** at that poin
1a900 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69  t because identi
1a910 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65  fiers had not ye
1a920 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  t been resolved.
1a930 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
1a940 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
1a950 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73  r identifier res
1a960 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
1a970 69 63 20 69 6e 74 20 73 65 6c 65 63 74 41 64 64  ic int selectAdd
1a980 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
1a990 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
1a9a0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1a9b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
1a9c0 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
1a9d0 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  t *pTabList;.  s
1a9e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1a9f0 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73  em *pFrom;..  as
1aa00 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
1aa10 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
1aa20 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  );.  if( (p->sel
1aa30 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
1aa40 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20  peInfo)==0 ){.  
1aa50 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
1aa60 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b   SF_HasTypeInfo;
1aa70 0a 20 20 20 20 70 50 61 72 73 65 20 3d 20 70 57  .    pParse = pW
1aa80 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
1aa90 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
1aaa0 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69  >pSrc;.    for(i
1aab0 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
1aac0 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
1aad0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
1aae0 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61  rom++){.      Ta
1aaf0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
1ab00 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  m->pTab;.      i
1ab10 66 28 20 70 54 61 62 20 26 26 20 28 70 54 61 62  f( pTab && (pTab
1ab20 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
1ab30 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b  Ephemeral)!=0 ){
1ab40 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75  .        /* A su
1ab50 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
1ab60 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
1ab70 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
1ab80 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
1ab90 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
1aba0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1abb0 20 70 53 65 6c 20 29 3b 0a 20 20 20 20 20 20 20   pSel );.       
1abc0 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
1abd0 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53  rior ) pSel = pS
1abe0 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
1abf0 20 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c      selectAddCol
1ac00 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
1ac10 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
1ac20 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43  ->nCol, pTab->aC
1ac30 6f 6c 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20  ol, pSel);.     
1ac40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1ac50 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1ac60 75 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  ue;.}.#endif.../
1ac70 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ac80 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20  e adds datatype 
1ac90 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
1aca0 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69  quence informati
1acb0 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62  on to.** the Tab
1acc0 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  le structures of
1acd0 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
1ace0 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61   subqueries in a
1acf0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
1ad00 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  ment..**.** Use 
1ad10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74  this routine aft
1ad20 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  er name resoluti
1ad30 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1ad40 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
1ad50 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73  AddTypeInfo(Pars
1ad60 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
1ad70 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66  t *pSelect){.#if
1ad80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ad90 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b  _SUBQUERY.  Walk
1ada0 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63  er w;.  w.xSelec
1adb0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65  tCallback = sele
1adc0 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
1add0 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72  eInfo;.  w.xExpr
1ade0 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57  Callback = exprW
1adf0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
1ae00 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
1ae10 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
1ae20 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
1ae30 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
1ae40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
1ae50 74 73 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  ts of a SELECT s
1ae60 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
1ae70 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  cessing.  The.**
1ae80 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63   following is ac
1ae90 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a  complished:.**.*
1aea0 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75  *     *  VDBE Cu
1aeb0 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65  rsor numbers are
1aec0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
1aed0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72   FROM-clause ter
1aee0 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70  ms..**     *  Ep
1aef0 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62  hemeral Table ob
1af00 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
1af10 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  d for all FROM-c
1af20 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
1af30 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61  ..**     *  ON a
1af40 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1af50 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74   are shifted int
1af60 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e  o WHERE statemen
1af70 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c  ts.**     *  Wil
1af80 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22  dcards "*" and "
1af90 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75  TABLE.*" in resu
1afa0 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61  lt sets are expa
1afb0 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  nded..**     *  
1afc0 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65  Identifiers in e
1afd0 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61  xpression are ma
1afe0 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e  tched to tables.
1aff0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1b000 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69  ine acts recursi
1b010 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71  vely on all subq
1b020 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68  ueries within th
1b030 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
1b040 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  d sqlite3SelectP
1b050 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rep(.  Parse *pP
1b060 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
1b070 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
1b080 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
1b090 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1b0a0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
1b0b0 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
1b0c0 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
1b0d0 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
1b0e0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
1b0f0 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a   for container *
1b100 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
1b110 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  db;.  if( p==0 )
1b120 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
1b130 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1b140 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
1b150 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
1b160 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
1b170 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
1b180 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b190 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1b1a0 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
1b1b0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
1b1c0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1b1d0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1b1e0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
1b1f0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
1b200 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
1b210 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
1b220 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1b230 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1b240 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
1b250 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
1b260 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73  ddTypeInfo(pPars
1b270 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, p);.}../*.** 
1b280 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
1b290 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
1b2a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
1b2b0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
1b2c0 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
1b2d0 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
1b2e0 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
1b2f0 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
1b300 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
1b310 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
1b320 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d  s.** routine sim
1b330 70 6c 79 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  ply stores NULLs
1b340 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
1b350 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a   memory cells..*
1b360 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
1b370 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
1b380 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
1b390 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
1b3a0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1b3b0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1b3c0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
1b3d0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
1b3e0 6e 63 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e  nc;.  if( pAggIn
1b3f0 66 6f 2d 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e  fo->nFunc+pAggIn
1b400 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29  fo->nColumn==0 )
1b410 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1b420 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
1b430 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
1b440 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1b450 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b460 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
1b470 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
1b480 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Mem);.  }.  for(
1b490 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
1b4a0 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
1b4b0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1b4c0 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
1b4d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b4e0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1b4f0 30 2c 20 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b  0, pFunc->iMem);
1b500 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
1b510 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
1b520 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
1b530 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
1b540 20 20 20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69       if( pE->pLi
1b550 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 4c 69  st==0 || pE->pLi
1b560 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
1b570 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b580 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b590 22 44 49 53 54 49 4e 43 54 20 69 6e 20 61 67 67  "DISTINCT in agg
1b5a0 72 65 67 61 74 65 20 6d 75 73 74 20 62 65 20 66  regate must be f
1b5b0 6f 6c 6c 6f 77 65 64 20 22 0a 20 20 20 20 20 20  ollowed ".      
1b5c0 20 20 20 20 20 22 62 79 20 61 6e 20 65 78 70 72       "by an expr
1b5d0 65 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20  ession");.      
1b5e0 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
1b5f0 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
1b600 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
1b610 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1b620 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
1b630 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
1b640 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
1b650 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b660 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
1b670 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e  hemeral, pFunc->
1b680 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c  iDistinct, 0, 0,
1b690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b6a0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1b6b0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
1b6c0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
1b6d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b6e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
1b6f0 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
1b700 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
1b710 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
1b720 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
1b730 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
1b740 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
1b750 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
1b760 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
1b770 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
1b780 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1b790 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1b7a0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1b7b0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1b7c0 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
1b7d0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
1b7e0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
1b7f0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
1b800 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
1b810 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
1b820 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73   pF->pExpr->pLis
1b830 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
1b840 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
1b850 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
1b860 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
1b870 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a  ->nExpr : 0, 0,.
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b890 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
1b8a0 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
1b8b0 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
1b8c0 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
1b8d0 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
1b8e0 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
1b8f0 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
1b900 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
1b910 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
1b920 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1b930 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
1b940 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b950 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1b960 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
1b970 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1b980 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1b990 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
1b9a0 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
1b9b0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
1b9c0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
1b9d0 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Mode = 1;.  for(
1b9e0 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
1b9f0 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
1ba00 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
1ba10 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
1ba20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
1ba30 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
1ba40 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20  int regAgg;.    
1ba50 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
1ba60 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69  = pF->pExpr->pLi
1ba70 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  st;.    if( pLis
1ba80 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
1ba90 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
1baa0 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
1bab0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
1bac0 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
1bad0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1bae0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
1baf0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
1bb00 65 67 41 67 67 2c 20 30 29 3b 0a 20 20 20 20 7d  egAgg, 0);.    }
1bb10 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67  else{.      nArg
1bb20 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41   = 0;.      regA
1bb30 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gg = 0;.    }.  
1bb40 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69    if( pF->iDisti
1bb50 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
1bb60 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
1bb70 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1bb80 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
1bb90 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20  ( nArg==1 );.   
1bba0 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
1bbb0 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73  pParse, pF->iDis
1bbc0 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c  tinct, addrNext,
1bbd0 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20   1, regAgg);.   
1bbe0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
1bbf0 46 75 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65  Func->needCollSe
1bc00 71 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  q ){.      CollS
1bc10 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
1bc20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
1bc30 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1bc40 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
1bc50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
1bc60 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69  st!=0 );  /* pLi
1bc70 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75  st!=0 if pF->pFu
1bc80 6e 63 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20  nc->needCollSeq 
1bc90 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 20 20 20  is true */.     
1bca0 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
1bcb0 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c  pList->a; !pColl
1bcc0 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c   && j<nArg; j++,
1bcd0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1bce0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
1bcf0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
1bd00 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
1bd10 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
1bd20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
1bd30 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
1bd40 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
1bd50 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
1bd60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1bd70 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
1bd80 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20  llSeq, 0, 0, 0, 
1bd90 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
1bda0 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
1bdb0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1bdc0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67  eAddOp4(v, OP_Ag
1bdd0 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67  gStep, 0, regAgg
1bde0 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20  , pF->iMem,.    
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be00 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75    (void*)pF->pFu
1be10 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
1be20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1be30 43 68 61 6e 67 65 50 35 28 76 2c 20 6e 41 72 67  ChangeP5(v, nArg
1be40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1be50 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
1be60 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
1be70 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
1be80 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
1be90 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
1bea0 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
1beb0 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
1bec0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1bed0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1bee0 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
1bef0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
1bf00 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
1bf10 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
1bf20 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
1bf30 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
1bf40 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1bf50 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
1bf60 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a  xpr, pC->iMem);.
1bf70 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e    }.  pAggInfo->
1bf80 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a  directMode = 0;.
1bf90 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1bfa0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  e code for the S
1bfb0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1bfc0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61  given in the p a
1bfd0 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  rgument.  .**.**
1bfe0 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
1bff0 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
1c000 76 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70  various ways dep
1c010 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a  ending on the.**
1c020 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1c030 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
1c040 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
1c050 20 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65   by argument pDe
1c060 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  st.** as follows
1c070 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73  :.**.**     pDes
1c080 74 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75  t->eDest    Resu
1c090 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d  lt.**     ------
1c0a0 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
1c0b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c0c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c0d0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54  -----.**     SRT
1c0e0 5f 4f 75 74 70 75 74 20 20 20 20 20 20 47 65 6e  _Output      Gen
1c0f0 65 72 61 74 65 20 61 20 72 6f 77 20 6f 66 20 6f  erate a row of o
1c100 75 74 70 75 74 20 28 75 73 69 6e 67 20 74 68 65  utput (using the
1c110 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a   OP_ResultRow.**
1c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c130 20 20 20 20 20 6f 70 63 6f 64 65 29 20 66 6f 72       opcode) for
1c140 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65   each row in the
1c150 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a   result set..**.
1c160 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20  **     SRT_Mem  
1c170 20 20 20 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69         Only vali
1c180 64 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  d if the result 
1c190 69 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  is a single colu
1c1a0 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  mn..**          
1c1b0 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65             Store
1c1c0 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   the first colum
1c1d0 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  n of the first r
1c1e0 65 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20  esult row.**    
1c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c200 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65   in register pDe
1c210 73 74 2d 3e 69 50 61 72 6d 20 74 68 65 6e 20 61  st->iParm then a
1c220 62 61 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a  bandon the rest.
1c230 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1c240 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 71 75         of the qu
1c250 65 72 79 2e 20 20 54 68 69 73 20 64 65 73 74 69  ery.  This desti
1c260 6e 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22  nation implies "
1c270 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20  LIMIT 1"..**.** 
1c280 20 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20      SRT_Set     
1c290 20 20 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d      The result m
1c2a0 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ust be a single 
1c2b0 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65  column.  Store e
1c2c0 61 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ach.**          
1c2d0 20 20 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f             row o
1c2e0 66 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20  f result as the 
1c2f0 6b 65 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65  key in table pDe
1c300 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20  st->iParm. .**  
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66     Apply the aff
1c330 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66  inity pDest->aff
1c340 69 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74 6f  inity before sto
1c350 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ring.**         
1c360 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75              resu
1c370 6c 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d  lts.  Used to im
1c380 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c  plement "IN (SEL
1c390 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a  ECT ...)"..**.**
1c3a0 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20       SRT_Union  
1c3b0 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
1c3c0 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61  ts as a key in a
1c3d0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1c3e0 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
1c3f0 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63  *.**     SRT_Exc
1c400 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20  ept      Remove 
1c410 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65  results from the
1c420 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1c430 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a   pDest->iParm..*
1c440 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62  *.**     SRT_Tab
1c450 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72  le       Store r
1c460 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72  esults in tempor
1c470 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d  ary table pDest-
1c480 3e 69 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20  >iParm..**      
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
1c4a0 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f  his is like SRT_
1c4b0 45 70 68 65 6d 54 61 62 20 65 78 63 65 70 74 20  EphemTab except 
1c4c0 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a 2a  that the table.*
1c4d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1c4e0 20 20 20 20 20 20 69 73 20 61 73 73 75 6d 65 64        is assumed
1c4f0 20 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20 6f   to already be o
1c500 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  pen..**.**     S
1c510 52 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43  RT_EphemTab    C
1c520 72 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61  reate an tempora
1c530 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
1c540 69 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a  iParm and store.
1c550 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1c560 20 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c         the resul
1c570 74 20 74 68 65 72 65 2e 20 54 68 65 20 63 75 72  t there. The cur
1c580 73 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e  sor is left open
1c590 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20   after.**       
1c5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1c5b0 74 75 72 6e 69 6e 67 2e 20 20 54 68 69 73 20 69  turning.  This i
1c5c0 73 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c 65  s like SRT_Table
1c5d0 20 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20   except that.** 
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5f0 20 20 20 20 74 68 69 73 20 64 65 73 74 69 6e 61      this destina
1c600 74 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65  tion uses OP_Ope
1c610 6e 45 70 68 65 6d 65 72 61 6c 20 74 6f 20 63 72  nEphemeral to cr
1c620 65 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  eate.**         
1c630 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
1c640 74 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a  table first..**.
1c650 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75  **     SRT_Corou
1c660 74 69 6e 65 20 20 20 47 65 6e 65 72 61 74 65 20  tine   Generate 
1c670 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61  a co-routine tha
1c680 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20  t returns a new 
1c690 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  row of.**       
1c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1c6b0 73 75 6c 74 73 20 65 61 63 68 20 74 69 6d 65 20  sults each time 
1c6c0 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20  it is invoked.  
1c6d0 54 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a  The entry point.
1c6e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1c6f0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
1c700 2d 72 6f 75 74 69 6e 65 20 69 73 20 73 74 6f 72  -routine is stor
1c710 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 70  ed in register p
1c720 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a  Dest->iParm..**.
1c730 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74  **     SRT_Exist
1c740 73 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31  s      Store a 1
1c750 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
1c760 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 69 66 20  pDest->iParm if 
1c770 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20  the result.**   
1c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c790 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d 70    set is not emp
1c7a0 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  ty..**.**     SR
1c7b0 54 5f 44 69 73 63 61 72 64 20 20 20 20 20 54 68  T_Discard     Th
1c7c0 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73 20  row the results 
1c7d0 61 77 61 79 2e 20 20 54 68 69 73 20 69 73 20 75  away.  This is u
1c7e0 73 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a 2a  sed by SELECT.**
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c800 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73 20       statements 
1c810 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 20  within triggers 
1c820 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70 6f  whose only purpo
1c830 73 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  se is.**        
1c840 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
1c850 20 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f 66   side-effects of
1c860 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a   functions..**.*
1c870 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1c880 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
1c890 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
1c8a0 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a   any errors are.
1c8b0 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
1c8c0 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  then an appropri
1c8d0 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
1c8e0 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20  e is left in.** 
1c8f0 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
1c900 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1c910 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65  ine does NOT fre
1c920 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72  e the Select str
1c930 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e  ucture passed in
1c940 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
1c950 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73  g function needs
1c960 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
1c970 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
1c980 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
1c990 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
1c9a0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
1c9b0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
1c9c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1c9d0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
1c9e0 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
1c9f0 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  d. */.  SelectDe
1ca00 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f  st *pDest      /
1ca10 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
1ca20 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  h the query resu
1ca30 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
1ca40 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
1ca50 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1ca60 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ers */.  WhereIn
1ca70 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
1ca80 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73  /* Return from s
1ca90 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
1caa0 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  () */.  Vdbe *v;
1cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cac0 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61  * The virtual ma
1cad0 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73  chine under cons
1cae0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
1caf0 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20  t isAgg;        
1cb00 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1cb10 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69   select lists li
1cb20 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f  ke "count(*)" */
1cb30 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1cb40 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ist;      /* Lis
1cb50 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
1cb60 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72  extract. */.  Sr
1cb70 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
1cb80 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1cb90 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74  tables to select
1cba0 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20   from */.  Expr 
1cbb0 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20  *pWhere;        
1cbc0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
1cbd0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
1cbe0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
1cbf0 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
1cc00 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
1cc10 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1cc20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
1cc30 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
1cc40 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
1cc50 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
1cc60 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
1cc70 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
1cc80 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
1cc90 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1cca0 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  NULL */.  int is
1ccb0 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
1ccc0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1ccd0 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
1cce0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
1ccf0 20 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20   int distinct;  
1cd00 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1cd10 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
1cd20 64 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a  distinct set */.
1cd30 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
1cd40 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1cd50 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
1cd60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
1cd70 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74  /.  int addrSort
1cd80 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64  Index;     /* Ad
1cd90 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f  dress of an OP_O
1cda0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
1cdb0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67  truction */.  Ag
1cdc0 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20  gInfo sAggInfo; 
1cdd0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1cde0 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72  ion used by aggr
1cdf0 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f  egate queries */
1ce00 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20  .  int iEnd;    
1ce10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1ce20 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20  ress of the end 
1ce30 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  of the query */.
1ce40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
1ce50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ce60 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1ce70 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70  ion */..  db = p
1ce80 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1ce90 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
1cea0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
1ceb0 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
1cec0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
1ced0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1cee0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1cef0 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
1cf00 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
1cf10 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
1cf20 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
1cf30 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 70  sAggInfo));..  p
1cf40 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1cf50 64 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e  derBy;.  if( Ign
1cf60 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
1cf70 65 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70  est) ){.    p->p
1cf80 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20  OrderBy = 0;..  
1cf90 20 20 2f 2a 20 49 6e 20 74 68 65 73 65 20 63 61    /* In these ca
1cfa0 73 65 73 20 74 68 65 20 44 49 53 54 49 4e 43 54  ses the DISTINCT
1cfb0 20 6f 70 65 72 61 74 6f 72 20 6d 61 6b 65 73 20   operator makes 
1cfc0 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 74 6f  no difference to
1cfd0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75   the.    ** resu
1cfe0 6c 74 73 2c 20 73 6f 20 72 65 6d 6f 76 65 20 69  lts, so remove i
1cff0 74 20 69 66 20 69 74 20 77 65 72 65 20 73 70 65  t if it were spe
1d000 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  cified..    */. 
1d010 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d     assert(pDest-
1d020 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73  >eDest==SRT_Exis
1d030 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ts || pDest->eDe
1d040 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c  st==SRT_Union ||
1d050 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65   .           pDe
1d060 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
1d070 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e  xcept || pDest->
1d080 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
1d090 72 64 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  rd);.    p->selF
1d0a0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
1d0b0 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  inct;.  }.  sqli
1d0c0 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
1d0d0 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 69  arse, p, 0);.  i
1d0e0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1d0f0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
1d100 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d  ct_end;.  }.  p-
1d110 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
1d120 65 72 42 79 3b 0a 0a 0a 20 20 2f 2a 20 4d 61 6b  erBy;...  /* Mak
1d130 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f  e local copies o
1d140 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
1d150 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e   for this query.
1d160 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74  .  */.  pTabList
1d170 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 73   = p->pSrc;.  is
1d180 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  Agg = (p->selFla
1d190 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
1d1a0 65 29 21 3d 30 3b 0a 20 20 70 45 4c 69 73 74 20  e)!=0;.  pEList 
1d1b0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69  = p->pEList;.  i
1d1c0 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67  f( pEList==0 ) g
1d1d0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1d1e0 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e  .  /* .  ** Do n
1d1f0 6f 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20  ot even attempt 
1d200 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20  to generate any 
1d210 63 6f 64 65 20 69 66 20 77 65 20 68 61 76 65 20  code if we have 
1d220 61 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a  already seen.  *
1d230 2a 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20  * errors before 
1d240 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61  this routine sta
1d250 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rts..  */.  if( 
1d260 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
1d270 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
1d280 3b 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59  ;..  /* ORDER BY
1d290 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20   is ignored for 
1d2a0 73 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  some destination
1d2b0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 67  s..  */.  if( Ig
1d2c0 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
1d2d0 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70 4f 72  Dest) ){.    pOr
1d2e0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a  derBy = 0;.  }..
1d2f0 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72    /* Begin gener
1d300 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f  ating code..  */
1d310 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1d320 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1d330 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f   if( v==0 ) goto
1d340 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
1d350 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1d360 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
1d370 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
1d380 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66   clause.  */.#if
1d390 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1d3a0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1d3b0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1d3c0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
1d3d0 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72  for(i=0; !p->pPr
1d3e0 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73  ior && i<pTabLis
1d3f0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
1d400 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
1d410 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1d420 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
1d430 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20  .    SelectDest 
1d440 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  dest;.    Select
1d450 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
1d460 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74  pSelect;.    int
1d470 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20   isAggSub;..    
1d480 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 70  if( pSub==0 || p
1d490 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65  Item->isPopulate
1d4a0 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  d ) continue;.. 
1d4b0 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
1d4c0 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79  Parse.nHeight by
1d4d0 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74   the height of t
1d4e0 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65  he largest expre
1d4f0 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65  ssion.    ** tre
1d500 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20  e refered to by 
1d510 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74  this, the parent
1d520 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69   select. The chi
1d530 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a  ld select.    **
1d540 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70   may contain exp
1d550 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66  ression trees of
1d560 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20   at most.    ** 
1d570 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  (SQLITE_MAX_EXPR
1d580 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65  _DEPTH-Parse.nHe
1d590 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68  ight) height. Th
1d5a0 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20  is is a bit.    
1d5b0 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61  ** more conserva
1d5c0 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73  tive than necess
1d5d0 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61  ary, but much ea
1d5e0 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63  sier than enforc
1d5f0 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78  ing.    ** an ex
1d600 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a  act limit..    *
1d610 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  /.    pParse->nH
1d620 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33  eight += sqlite3
1d630 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
1d640 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
1d650 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
1d660 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65   subquery can be
1d670 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 74   absorbed into t
1d680 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  he parent. */.  
1d690 20 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53    isAggSub = (pS
1d6a0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
1d6b0 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
1d6c0 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e  .    if( flatten
1d6d0 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
1d6e0 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73   p, i, isAgg, is
1d6f0 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20  AggSub) ){.     
1d700 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b   if( isAggSub ){
1d710 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d  .        isAgg =
1d720 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73   1;.        p->s
1d730 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
1d740 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d  gregate;.      }
1d750 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
1d760 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d770 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
1d780 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
1d790 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d  _EphemTab, pItem
1d7a0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
1d7b0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1d7c0 3e 69 73 50 6f 70 75 6c 61 74 65 64 3d 3d 30 20  >isPopulated==0 
1d7d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d7e0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
1d7f0 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
1d800 20 20 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75     pItem->isPopu
1d810 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  lated = 1;.    }
1d820 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
1d830 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
1d840 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1d850 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1d860 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  nd;.    }.    pP
1d870 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
1d880 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
1d890 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20  prHeight(p);.   
1d8a0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
1d8b0 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49 67  Src;.    if( !Ig
1d8c0 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
1d8d0 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70  Dest) ){.      p
1d8e0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
1d8f0 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  derBy;.    }.  }
1d900 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
1d910 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20  EList;.#endif.  
1d920 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
1d930 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d  re;.  pGroupBy =
1d940 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
1d950 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
1d960 76 69 6e 67 3b 0a 20 20 69 73 44 69 73 74 69 6e  ving;.  isDistin
1d970 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ct = (p->selFlag
1d980 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
1d990 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  !=0;..#ifndef SQ
1d9a0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
1d9b0 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49  ND_SELECT.  /* I
1d9c0 66 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61  f there is are a
1d9d0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65   sequence of que
1d9e0 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72  ries, do the ear
1d9f0 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e  lier ones first.
1da00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
1da10 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1da20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d   p->pRightmost==
1da30 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  0 ){.      Selec
1da40 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68  t *pLoop, *pRigh
1da50 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
1da60 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20   cnt = 0;.      
1da70 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a 20 20  int mxSelect;.  
1da80 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
1da90 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
1daa0 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74  oop->pPrior, cnt
1dab0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  ++){.        pLo
1dac0 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  op->pRightmost =
1dad0 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   p;.        pLoo
1dae0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67 68  p->pNext = pRigh
1daf0 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67 68  t;.        pRigh
1db00 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20  t = pLoop;.     
1db10 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c 65 63   }.      mxSelec
1db20 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  t = db->aLimit[S
1db30 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
1db40 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a 20 20  OUND_SELECT];.  
1db50 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65 63 74      if( mxSelect
1db60 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74   && cnt>mxSelect
1db70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1db80 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1db90 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65  se, "too many te
1dba0 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20  rms in compound 
1dbb0 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20 20  SELECT");.      
1dbc0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1dbd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
1dbe0 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
1dbf0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
1dc00 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  t);.  }.#endif..
1dc10 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20    /* If writing 
1dc20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e  to memory or gen
1dc30 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20  erating a set.  
1dc40 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ** only a single
1dc50 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f   column may be o
1dc60 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  utput..  */.#ifn
1dc70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1dc80 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63  SUBQUERY.  if( c
1dc90 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
1dca0 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
1dcb0 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c  arse, pDest, pEL
1dcc0 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
1dcd0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
1dce0 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
1dcf0 20 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65    /* If possible
1dd00 2c 20 72 65 77 72 69 74 65 20 74 68 65 20 71 75  , rewrite the qu
1dd10 65 72 79 20 74 6f 20 75 73 65 20 47 52 4f 55 50  ery to use GROUP
1dd20 20 42 59 20 69 6e 73 74 65 61 64 20 6f 66 20 44   BY instead of D
1dd30 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20 47 52  ISTINCT..  ** GR
1dd40 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75 73 65  OUP BY might use
1dd50 20 61 6e 20 69 6e 64 65 78 2c 20 44 49 53 54 49   an index, DISTI
1dd60 4e 43 54 20 6e 65 76 65 72 20 64 6f 65 73 2e 0a  NCT never does..
1dd70 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73    */.  if( (p->s
1dd80 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
1dd90 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
1dda0 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
1ddb0 63 74 20 26 26 20 21 70 2d 3e 70 47 72 6f 75 70  ct && !p->pGroup
1ddc0 42 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70 47 72  By ){.    p->pGr
1ddd0 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
1dde0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
1ddf0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  ->pEList);.    p
1de00 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
1de10 6f 75 70 42 79 3b 0a 20 20 20 20 70 2d 3e 73 65  oupBy;.    p->se
1de20 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
1de30 73 74 69 6e 63 74 3b 0a 20 20 20 20 69 73 44 69  stinct;.    isDi
1de40 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 7d 0a  stinct = 0;.  }.
1de50 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
1de60 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
1de70 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20  ause, then this 
1de80 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  sorting.  ** ind
1de90 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  ex might end up 
1dea0 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20  being unused if 
1deb0 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20  the data can be 
1dec0 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20  .  ** extracted 
1ded0 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72  in pre-sorted or
1dee0 64 65 72 2e 20 20 49 66 20 74 68 61 74 20 69 73  der.  If that is
1def0 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
1df00 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e  the.  ** OP_Open
1df10 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
1df20 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68  ction will be ch
1df30 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e  anged to an OP_N
1df40 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65  oop once.  ** we
1df50 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74   figure out that
1df60 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
1df70 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64  ex is not needed
1df80 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49  .  The addrSortI
1df90 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62  ndex.  ** variab
1dfa0 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61  le is used to fa
1dfb0 63 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68  cilitate that ch
1dfc0 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ange..  */.  if(
1dfd0 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
1dfe0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1dff0 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  fo;.    pKeyInfo
1e000 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
1e010 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1e020 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f  OrderBy);.    pO
1e030 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
1e040 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1e050 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  +;.    p->addrOp
1e060 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72  enEphm[2] = addr
1e070 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20  SortIndex =.    
1e080 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e090 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
1e0a0 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0c0 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45      pOrderBy->iE
1e0d0 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79  Cursor, pOrderBy
1e0e0 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20  ->nExpr+2, 0,.  
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1e110 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
1e120 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
1e130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
1e140 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
1e150 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1e160 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
1e170 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
1e180 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
1e190 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
1e1a0 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
1e1b0 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
1e1c0 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
1e1d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e1e0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
1e1f0 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 70 45  pDest->iParm, pE
1e200 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
1e210 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1e220 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
1e230 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
1e240 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1e250 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
1e260 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
1e270 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  p, iEnd);..  /* 
1e280 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69  Open a virtual i
1e290 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
1e2a0 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
1e2b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44  ..  */.  if( isD
1e2c0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b  istinct ){.    K
1e2d0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1e2e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
1e2f0 41 67 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20  Agg || pGroupBy 
1e300 29 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20  );.    distinct 
1e310 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1e320 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
1e330 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
1e340 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e  List(pParse, p->
1e350 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pEList);.    sql
1e360 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1e370 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
1e380 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c  al, distinct, 0,
1e390 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1e3a0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1e3b0 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
1e3c0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
1e3d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
1e3e0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
1e3f0 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74  }..  /* Aggregat
1e400 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67  e and non-aggreg
1e410 61 74 65 20 71 75 65 72 69 65 73 20 61 72 65 20  ate queries are 
1e420 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
1e430 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  tly */.  if( !is
1e440 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
1e450 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
1e460 73 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e 6f  s case is for no
1e470 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
1e480 69 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e  ies.    ** Begin
1e490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1e4a0 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57  an.    */.    pW
1e4b0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
1e4c0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
1e4d0 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
1e4e0 65 2c 20 26 70 4f 72 64 65 72 42 79 2c 20 30 29  e, &pOrderBy, 0)
1e4f0 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
1e500 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
1e510 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49  t_end;..    /* I
1e520 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  f sorting index 
1e530 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64  that was created
1e540 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f   by a prior OP_O
1e550 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20  penEphemeral .  
1e560 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
1e570 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65   ended up not be
1e580 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e  ing needed, then
1e590 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   change the OP_O
1e5a0 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20  penEphemeral.   
1e5b0 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e   ** into an OP_N
1e5c0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
1e5d0 69 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65  if( addrSortInde
1e5e0 78 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79  x>=0 && pOrderBy
1e5f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
1e600 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
1e610 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
1e620 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20 20  Index, 1);.     
1e630 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
1e640 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  [2] = -1;.    }.
1e650 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
1e660 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c  standard inner l
1e670 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  oop.    */.    a
1e680 73 73 65 72 74 28 21 69 73 44 69 73 74 69 6e 63  ssert(!isDistinc
1e690 74 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49 6e  t);.    selectIn
1e6a0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
1e6b0 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
1e6c0 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 70   pOrderBy, -1, p
1e6d0 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
1e6e0 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
1e6f0 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49  ->iContinue, pWI
1e700 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
1e710 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61     /* End the da
1e720 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70  tabase scan loop
1e730 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
1e740 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
1e750 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nfo);.  }else{. 
1e760 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
1e770 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  e processing for
1e780 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
1e790 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  es */.    NameCo
1e7a0 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a  ntext sNC;    /*
1e7b0 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
1e7c0 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  r processing agg
1e7d0 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
1e7e0 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  on */.    int iA
1e7f0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
1e800 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
1e810 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63  ss for storing c
1e820 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
1e830 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d  */.    int iBMem
1e840 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
1e850 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
1e860 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f  for previous GRO
1e870 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
1e880 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20   iUseFlag;      
1e890 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
1e8a0 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64  holding flag ind
1e8b0 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20  icating that at 
1e8c0 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20  least.          
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1e8e0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
1e8f0 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67  input to the agg
1e900 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e  regator has been
1e910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e920 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1e930 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  essed */.    int
1e940 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20   iAbortFlag;    
1e950 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
1e960 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65  which causes que
1e970 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69  ry abort if posi
1e980 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tive */.    int 
1e990 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20  groupBySort;    
1e9a0 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f  /* Rows come fro
1e9b0 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55  m source in GROU
1e9c0 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 0a 0a  P BY order */...
1e9d0 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
1e9e0 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20 68  wing variables h
1e9f0 6f 6c 64 20 61 64 64 72 65 73 73 65 73 20 6f 72  old addresses or
1ea00 20 6c 61 62 65 6c 73 20 66 6f 72 20 70 61 72 74   labels for part
1ea10 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
1ea20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
1ea30 70 72 6f 67 72 61 6d 20 77 65 20 61 72 65 20 70  program we are p
1ea40 75 74 74 69 6e 67 20 74 6f 67 65 74 68 65 72 20  utting together 
1ea50 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4f  */.    int addrO
1ea60 75 74 70 75 74 52 6f 77 3b 20 20 20 20 20 20 2f  utputRow;      /
1ea70 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f  * Start of subro
1ea80 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
1ea90 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20  ts a result row 
1eaa0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 4f 75  */.    int regOu
1eab0 74 70 75 74 52 6f 77 3b 20 20 20 20 20 20 20 2f  tputRow;       /
1eac0 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
1ead0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75   register for ou
1eae0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
1eaf0 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53  */.    int addrS
1eb00 65 74 41 62 6f 72 74 3b 20 20 20 20 20 20 20 2f  etAbort;       /
1eb10 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
1eb20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
1eb30 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 49  */.    int addrI
1eb40 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f 70 3b 20 2f  nitializeLoop; /
1eb50 2a 20 53 74 61 72 74 20 6f 66 20 63 6f 64 65 20  * Start of code 
1eb60 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73  that initializes
1eb70 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
1eb80 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 54  */.    int addrT
1eb90 6f 70 4f 66 4c 6f 6f 70 3b 20 20 20 20 20 20 2f  opOfLoop;      /
1eba0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70  * Top of the inp
1ebb0 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  ut loop */.    i
1ebc0 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
1ebd0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
1ebe0 20 61 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20   all processing 
1ebf0 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53  */.    int addrS
1ec00 6f 72 74 69 6e 67 49 64 78 3b 20 20 20 20 20 2f  ortingIdx;     /
1ec10 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  * The OP_OpenEph
1ec20 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73  emeral for the s
1ec30 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  orting index */.
1ec40 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
1ec50 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  t;          /* S
1ec60 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65  ubroutine for re
1ec70 73 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75  setting the accu
1ec80 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69  mulator */.    i
1ec90 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20  nt regReset;    
1eca0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1ecb0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
1ecc0 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
1ecd0 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 61  outine */..    a
1ece0 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ddrEnd = sqlite3
1ecf0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1ed00 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
1ed10 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
1ed20 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
1ed30 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
1ed40 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
1ed50 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
1ed60 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
1ed70 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
1ed80 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
1ed90 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
1eda0 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
1edb0 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
1edc0 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
1edd0 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
1ede0 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
1edf0 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
1ee00 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67  ist;.    sNC.pAg
1ee10 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66  gInfo = &sAggInf
1ee20 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  o;.    sAggInfo.
1ee30 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
1ee40 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
1ee50 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20  upBy->nExpr+1 : 
1ee60 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
1ee70 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
1ee80 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBy;.    sqlite3
1ee90 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
1eea0 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
1eeb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1eec0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
1eed0 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 3b  &sNC, pOrderBy);
1eee0 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
1eef0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ef00 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1ef10 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
1ef20 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ving);.    }.   
1ef30 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d   sAggInfo.nAccum
1ef40 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66  ulator = sAggInf
1ef50 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66  o.nColumn;.    f
1ef60 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
1ef70 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  fo.nFunc; i++){.
1ef80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ef90 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
1efa0 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
1efb0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 70  Func[i].pExpr->p
1efc0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1efd0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1efe0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
1eff0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
1f000 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   Processing for 
1f010 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20  aggregates with 
1f020 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79  GROUP BY is very
1f030 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20   different and. 
1f040 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20     ** much more 
1f050 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67  complex than agg
1f060 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20  regates without 
1f070 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20  a GROUP BY..    
1f080 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
1f090 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  pBy ){.      Key
1f0a0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
1f0b0 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72   /* Keying infor
1f0c0 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67  mation for the g
1f0d0 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
1f0e0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 0a  /.      int j1;.
1f0f0 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
1f100 20 6c 61 62 65 6c 73 20 74 68 61 74 20 77 65 20   labels that we 
1f110 77 69 6c 6c 20 62 65 20 6e 65 65 64 69 6e 67 0a  will be needing.
1f120 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
1f130 64 64 72 49 6e 69 74 69 61 6c 69 7a 65 4c 6f 6f  ddrInitializeLoo
1f140 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  p = sqlite3VdbeM
1f150 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
1f160 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1f170 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  is a GROUP BY cl
1f180 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65  ause we might ne
1f190 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  ed a sorting ind
1f1a0 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69  ex to.      ** i
1f1b0 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c  mplement it.  Al
1f1c0 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74  locate that sort
1f1d0 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20  ing index now.  
1f1e0 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a  If it turns out.
1f1f0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
1f200 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20   do not need it 
1f210 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f  after all, the O
1f220 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
1f230 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  truction.      *
1f240 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  * will be conver
1f250 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e  ted into a Noop.
1f260 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
1f270 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
1f280 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ngIdx = pParse->
1f290 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b  nTab++;.      pK
1f2a0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
1f2b0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
1f2c0 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a  rse, pGroupBy);.
1f2d0 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e        addrSortin
1f2e0 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64  gIdx = sqlite3Vd
1f2f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
1f300 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20  penEphemeral, . 
1f310 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
1f320 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41  o.sortingIdx, sA
1f330 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
1f340 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20  olumn, .        
1f350 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79    0, (char*)pKey
1f360 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1f370 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20  _HANDOFF);..    
1f380 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1f390 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
1f3a0 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
1f3b0 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
1f3c0 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
1f3d0 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
1f3e0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1f3f0 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
1f400 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
1f410 65 6d 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  em;.      iAMem 
1f420 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
1f430 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
1f440 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
1f450 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
1f460 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
1f470 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
1f480 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1f490 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
1f4a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f4b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1f4c0 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f  Integer, 0, iAbo
1f4d0 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
1f4e0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1f4f0 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
1f500 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1f510 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1f520 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
1f530 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
1f540 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1f550 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75  "indicate accumu
1f560 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a  lator empty"));.
1f570 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f580 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1f590 74 6f 2c 20 30 2c 20 61 64 64 72 49 6e 69 74 69  to, 0, addrIniti
1f5a0 61 6c 69 7a 65 4c 6f 6f 70 29 3b 0a 0a 20 20 20  alizeLoop);..   
1f5b0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
1f5c0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1f5d0 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c   outputs a singl
1f5e0 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
1f5f0 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
1f600 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74 69  .  This subrouti
1f610 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61  ne first looks a
1f620 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20  t the iUseFlag. 
1f630 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20   If iUseFlag.   
1f640 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68     ** is less th
1f650 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
1f660 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ero, the subrout
1f670 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
1f680 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   If.      ** the
1f690 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c   processing call
1f6a0 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79 20  s for the query 
1f6b0 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73  to abort, this s
1f6c0 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
1f6d0 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  ** increments th
1f6e0 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d  e iAbortFlag mem
1f6f0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66  ory location bef
1f700 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ore returning in
1f710 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  .      ** order 
1f720 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61  to signal the ca
1f730 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20  ller to abort.. 
1f740 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
1f750 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c  drSetAbort = sql
1f760 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1f770 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
1f780 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f790 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
1f7a0 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
1f7b0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1f7c0 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20  ((v, "set abort 
1f7d0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 72  flag"));.      r
1f7e0 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b  egOutputRow = ++
1f7f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1f800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f810 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
1f820 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
1f830 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  );.      addrOut
1f840 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
1f850 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1f860 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
1f870 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1f880 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61  P_IfPos, iUseFla
1f890 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
1f8a0 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +2);.      VdbeC
1f8b0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75  omment((v, "Grou
1f8c0 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
1f8d0 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74  ator entry point
1f8e0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1f8f0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
1f900 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
1f910 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
1f920 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
1f930 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
1f940 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69  ggInfo);.      i
1f950 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
1f960 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f970 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1f980 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75   pHaving, addrOu
1f990 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54  tputRow+1, SQLIT
1f9a0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1f9b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c       }.      sel
1f9c0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
1f9d0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
1f9e0 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
1f9f0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
1fa00 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63           distinc
1fa10 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa30 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
1fa40 20 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a   addrSetAbort);.
1fa50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1fa60 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
1fa70 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
1fa80 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
1fa90 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
1faa0 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  groupby result g
1fab0 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20  enerator"));..  
1fac0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
1fad0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
1fae0 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65  t will reset the
1faf0 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75   group-by accumu
1fb00 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20  lator.      */. 
1fb10 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d       addrReset =
1fb20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1fb30 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1fb40 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70    regReset = ++p
1fb50 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1fb60 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
1fb70 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
1fb80 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
1fb90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1fba0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
1fbb0 67 52 65 73 65 74 29 3b 0a 0a 20 20 20 20 20 20  gReset);..      
1fbc0 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20  /* Begin a loop 
1fbd0 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
1fbe0 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77  t all source row
1fbf0 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  s in GROUP BY or
1fc00 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  der..      ** Th
1fc10 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65  is might involve
1fc20 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f   two separate lo
1fc30 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53  ops with an OP_S
1fc40 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20  ort in between, 
1fc50 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  or.      ** it m
1fc60 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65  ight be a single
1fc70 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20   loop that uses 
1fc80 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72  an index to extr
1fc90 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  act information.
1fca0 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
1fcb0 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62  right order to b
1fcc0 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20  egin with..     
1fcd0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1fce0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1fcf0 6c 28 76 2c 20 61 64 64 72 49 6e 69 74 69 61 6c  l(v, addrInitial
1fd00 69 7a 65 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  izeLoop);.      
1fd10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1fd20 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1fd30 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
1fd40 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  et);.      pWInf
1fd50 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
1fd60 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
1fd70 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
1fd80 26 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20  &pGroupBy, 0);. 
1fd90 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d       if( pWInfo=
1fda0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
1fdb0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  _end;.      if( 
1fdc0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
1fdd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
1fde0 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20  timizer is able 
1fdf0 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  to deliver rows 
1fe00 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65  in group by orde
1fe10 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  r so.        ** 
1fe20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  we do not have t
1fe30 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f  o sort.  The OP_
1fe40 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61  OpenEphemeral ta
1fe50 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ble will be.    
1fe60 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64      ** cancelled
1fe70 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77   later because w
1fe80 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
1fe90 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f  use the pKeyInfo
1fea0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1feb0 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
1fec0 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
1fed0 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
1fee0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1fef0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  {.        /* Row
1ff00 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74  s are coming out
1ff10 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64   in undetermined
1ff20 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65   order.  We have
1ff30 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20   to push.       
1ff40 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74   ** each row int
1ff50 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  o a sorting inde
1ff60 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  x, terminate the
1ff70 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20   first loop,.   
1ff80 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f       ** then loo
1ff90 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69  p over the sorti
1ffa0 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65  ng index in orde
1ffb0 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74  r to get the out
1ffc0 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  put.        ** i
1ffd0 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20  n sorted order. 
1ffe0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1fff0 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20    int regBase;. 
20000 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65         int regRe
20010 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  cord;.        in
20020 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t nCol;.        
20030 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20  int nGroupBy;.. 
20040 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
20050 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
20060 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  nGroupBy = pGrou
20070 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
20080 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75      nCol = nGrou
20090 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  pBy + 1;.       
200a0 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b   j = nGroupBy+1;
200b0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
200c0 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
200d0 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
200e0 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e        if( sAggIn
200f0 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74  fo.aCol[i].iSort
20100 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20  erColumn>=j ){. 
20110 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b             nCol+
20120 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  +;.            j
20130 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
20140 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20150 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69    regBase = sqli
20160 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
20170 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  pParse, nCol);. 
20180 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
20190 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
201a0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
201b0 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20   regBase, 0);.  
201c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
201d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
201e0 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f  quence, sAggInfo
201f0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67 42  .sortingIdx,regB
20200 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20  ase+nGroupBy);. 
20210 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
20220 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66  pBy+1;.        f
20230 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
20240 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
20250 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
20260 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
20270 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f  pCol = &sAggInfo
20280 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  .aCol[i];.      
20290 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
202a0 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
202b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
202c0 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61  t r1 = j + regBa
202d0 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
202e0 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20  int r2;..       
202f0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
20300 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
20310 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  mn(pParse, .    
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20330 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
20340 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f  >pTab, pCol->iCo
20350 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62  lumn, pCol->iTab
20360 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20  le, r1, 0);.    
20370 20 20 20 20 20 20 20 20 69 66 28 20 72 31 21 3d          if( r1!=
20380 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r2 ){.          
20390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
203a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
203b0 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20  y, r2, r1);.    
203c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
203d0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
203e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
203f0 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f  .        regReco
20400 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
20410 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
20420 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20430 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
20440 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
20450 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65  ase, nCol, regRe
20460 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
20470 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20480 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
20490 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
204a0 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64  ngIdx, regRecord
204b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
204c0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
204d0 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
204e0 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
204f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
20500 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
20510 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  Base, nCol);.   
20520 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
20530 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
20540 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20550 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
20560 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
20570 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64  tingIdx, addrEnd
20580 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
20590 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55  omment((v, "GROU
205a0 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20 20  P BY sort"));.  
205b0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75        sAggInfo.u
205c0 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31  seSortingIdx = 1
205d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
205e0 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
205f0 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
20600 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72  Y terms and stor
20610 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e  e in b0, b1, b2.
20620 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20  ...      ** (b0 
20630 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
20640 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69  on iBMem+0, b1 i
20650 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73  s iBMem+1, and s
20660 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a  o forth).      *
20670 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74  * Then compare t
20680 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
20690 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73   BY terms agains
206a0 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
206b0 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  erms.      ** fr
206c0 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  om the previous 
206d0 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74  row currently st
206e0 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20  ored in a0, a1, 
206f0 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  a2....      */. 
20700 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f       addrTopOfLo
20710 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
20720 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
20730 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
20740 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
20750 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
20760 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
20770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
20780 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
20790 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67  , OP_Column, sAg
207a0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
207b0 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  , j, iBMem+j);. 
207c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
207d0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
207e0 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  .directMode = 1;
207f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20800 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
20810 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a  e, pGroupBy->a[j
20820 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a  ].pExpr, iBMem+j
20830 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
20840 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
20850 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
20860 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65  OP_Compare, iAMe
20870 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iBMem, pGroup
20880 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  By->nExpr,.     
20890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208a0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
208b0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
208c0 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71  );.      j1 = sq
208d0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
208e0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
208f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
20900 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b  (v, OP_Jump, j1+
20910 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20  1, 0, j1+1);..  
20920 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
20930 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77  code that runs w
20940 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55  henever the GROU
20950 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20  P BY changes..  
20960 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69      ** Changes i
20970 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  n the GROUP BY a
20980 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74  re detected by t
20990 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
209a0 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e  .      ** block.
209b0 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20    If there were 
209c0 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73  no changes, this
209d0 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65   block is skippe
209e0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
209f0 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63    ** This code c
20a00 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72  opies current gr
20a10 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20  oup by terms in 
20a20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20  b0,b1,b2,....   
20a30 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30     ** over to a0
20a40 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e  ,a1,a2.  It then
20a50 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75   calls the outpu
20a60 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  t subroutine.   
20a70 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73     ** and resets
20a80 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
20a90 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
20aa0 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74  ters in preparat
20ab0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  ion.      ** for
20ac0 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20   the next GROUP 
20ad0 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20  BY batch..      
20ae0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
20af0 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
20b00 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65  rse, iBMem, iAMe
20b10 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
20b20 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
20b30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20b40 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
20b50 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
20b60 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
20b70 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
20b80 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29  utput one row"))
20b90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
20ba0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20bb0 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61  IfPos, iAbortFla
20bc0 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  g, addrEnd);.   
20bd0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
20be0 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20  v, "check abort 
20bf0 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73  flag"));.      s
20c00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20c10 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
20c20 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
20c30 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
20c40 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74  mment((v, "reset
20c50 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
20c60 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
20c70 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  e the aggregate 
20c80 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73  accumulators bas
20c90 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
20ca0 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  t of.      ** th
20cb0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20  e current row.  
20cc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
20cd0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
20ce0 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75  (v, j1);.      u
20cf0 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
20d00 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
20d10 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
20d20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20d30 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
20d40 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
20d50 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
20d60 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69  "indicate data i
20d70 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  n accumulator"))
20d80 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;..      /* End 
20d90 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20  of the loop.    
20da0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67    */.      if( g
20db0 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
20dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20dd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
20de0 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  xt, sAggInfo.sor
20df0 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70  tingIdx, addrTop
20e00 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d  OfLoop);.      }
20e10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
20e20 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
20e30 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
20e40 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
20e50 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
20e60 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a 20 20  rtingIdx, 1);.  
20e70 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
20e80 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c  Output the final
20e90 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20   row of result. 
20ea0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
20eb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20ec0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
20ed0 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
20ee0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
20ef0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
20f00 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72   "output final r
20f10 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 0a 20 20  ow"));.      .  
20f20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72    } /* endif pGr
20f30 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20 65 6c 73  oupBy */.    els
20f40 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  e {.      ExprLi
20f50 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b  st *pMinMax = 0;
20f60 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
20f70 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  *pDel = 0;.     
20f80 20 75 38 20 66 6c 61 67 3b 0a 0a 20 20 20 20 20   u8 flag;..     
20f90 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
20fa0 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65   query is of one
20fb0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
20fc0 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 2a  g forms:.      *
20fd0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c  *.      **   SEL
20fe0 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20  ECT min(x) FROM 
20ff0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 53  ....      **   S
21000 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
21010 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  M ....      **. 
21020 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73       ** If it is
21030 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63  , then ask the c
21040 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74  ode in where.c t
21050 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72  o attempt to sor
21060 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  t results.      
21070 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77  ** as if there w
21080 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20  as an "ORDER ON 
21090 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20  x" or "ORDER ON 
210a0 78 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20  x DESC" clause. 
210b0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65  .      ** If whe
210c0 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20  re.c is able to 
210d0 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20  produce results 
210e0 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f  sorted in this o
210f0 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20  rder, then.     
21100 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64   ** add vdbe cod
21110 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
21120 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  f the processing
21130 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20   loop after the 
21140 0a 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20  .      ** first 
21150 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65  iteration (since
21160 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
21170 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
21180 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 67 75   is .      ** gu
21190 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72  aranteed to oper
211a0 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77  ate on the row w
211b0 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  ith the minimum 
211c0 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20  or maximum .    
211d0 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c    ** value of x,
211e0 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65   the only row re
211f0 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 2a  quired)..      *
21200 2a 0a 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65  *.      ** A spe
21210 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62  cial flag must b
21220 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  e passed to sqli
21230 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
21240 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  to slightly.    
21250 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61    ** modify beha
21260 76 69 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73  viour as follows
21270 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
21280 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71   **   + If the q
21290 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43  uery is a "SELEC
212a0 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20  T min(x)", then 
212b0 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62  the loop coded b
212c0 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77  y.      **     w
212d0 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f  here.c should no
212e0 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  t iterate over a
212f0 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61  ny values with a
21300 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20   NULL value.    
21310 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a    **     for x..
21320 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21330 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69  *   + The optimi
21340 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72  zer code in wher
21350 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74  e.c (the thing t
21360 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63  hat decides whic
21370 68 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69  h.      **     i
21380 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20  ndex or indices 
21390 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70  to use) should p
213a0 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74  lace a different
213b0 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20   priority on .  
213c0 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73      **     satis
213d0 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52  fying the 'ORDER
213e0 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e   BY' clause than
213f0 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65   it does in othe
21400 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20 2a  r cases..      *
21410 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63  *     Refer to c
21420 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ode and comments
21430 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20   in where.c for 
21440 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 2a  details..      *
21450 2f 0a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d  /.      flag = m
21460 69 6e 4d 61 78 51 75 65 72 79 28 70 50 61 72 73  inMaxQuery(pPars
21470 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28  e, p);.      if(
21480 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20   flag ){.       
21490 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 20   pDel = pMinMax 
214a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
214b0 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69  tDup(db, p->pELi
214c0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
214d0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pList);.        
214e0 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21  if( pMinMax && !
214f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
21500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   ){.          pM
21510 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74  inMax->a[0].sort
21520 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48  Order = flag!=WH
21530 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b  ERE_ORDERBY_MIN;
21540 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d  .          pMinM
21550 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  ax->a[0].pExpr->
21560 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
21570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21580 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  }..      /* This
21590 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68   case runs if th
215a0 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  e aggregate has 
215b0 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
215c0 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  se.  The.      *
215d0 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  * processing is 
215e0 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e  much simpler sin
215f0 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  ce there is only
21600 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20   a single row.  
21610 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74      ** of output
21620 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
21630 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
21640 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
21650 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  nfo);.      pWIn
21660 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
21670 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
21680 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
21690 20 26 70 4d 69 6e 4d 61 78 2c 20 66 6c 61 67 29   &pMinMax, flag)
216a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
216b0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
216c0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
216d0 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
216e0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
216f0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
21700 20 7d 0a 20 20 20 20 20 20 75 70 64 61 74 65 41   }.      updateA
21710 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
21720 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
21730 20 20 20 20 20 69 66 28 20 21 70 4d 69 6e 4d 61       if( !pMinMa
21740 78 20 26 26 20 66 6c 61 67 20 29 7b 0a 20 20 20  x && flag ){.   
21750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21760 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
21770 6f 2c 20 30 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  o, 0, pWInfo->iB
21780 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 56  reak);.        V
21790 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
217a0 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 28  %s() by index",(
217b0 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45  flag==WHERE_ORDE
217c0 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d  RBY_MIN?"min":"m
217d0 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ax")));.      }.
217e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
217f0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
21800 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
21810 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
21820 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
21830 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
21840 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 61 76  ;.      if( pHav
21850 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
21860 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
21870 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
21880 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49  g, addrEnd, SQLI
21890 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
218a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65        }.      se
218b0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
218c0 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
218d0 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c  st, 0, 0, 0, -1,
218e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
218f0 20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20 61          pDest, a
21900 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29  ddrEnd, addrEnd)
21910 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
21920 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
21930 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a  b, pDel);.    }.
21940 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
21950 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
21960 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20  ddrEnd);.    .  
21970 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65  } /* endif aggre
21980 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20  gate query */.. 
21990 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
219a0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
219b0 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  se, then we need
219c0 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73   to sort the res
219d0 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ults.  ** and se
219e0 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63  nd them to the c
219f0 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f  allback one by o
21a00 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ne..  */.  if( p
21a10 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 67  OrderBy ){.    g
21a20 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
21a30 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45  pParse, p, v, pE
21a40 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65  List->nExpr, pDe
21a50 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  st);.  }..  /* J
21a60 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
21a70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f   this query.  */
21a80 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
21a90 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45  solveLabel(v, iE
21aa0 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  nd);..  /* The S
21ab0 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73  ELECT was succes
21ac0 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20  sfully coded.   
21ad0 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  Set the return c
21ae0 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f  ode to 0.  ** to
21af0 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72   indicate no err
21b00 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ors..  */.  rc =
21b10 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f   0;..  /* Contro
21b20 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20  l jumps to here 
21b30 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
21b40 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65  ncountered above
21b50 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73  , or upon.  ** s
21b60 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67  uccessful coding
21b70 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
21b80 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a    */.select_end:
21b90 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
21ba0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
21bb0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53  results of the S
21bc0 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65 20  ELECT are to be 
21bd0 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  output..  */.  i
21be0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21bf0 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74   && pDest->eDest
21c00 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
21c10 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
21c20 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
21c30 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
21c40 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
21c50 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
21c60 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71  Info.aCol);.  sq
21c70 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21c80 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b  sAggInfo.aFunc);
21c90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21ca0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
21cb0 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
21cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
21d10 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
21d20 6f 64 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ode is used for 
21d30 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
21d40 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 54 68 65  gging only.  The
21d50 20 63 6f 64 65 0a 2a 2a 20 74 68 61 74 20 66 6f   code.** that fo
21d60 6c 6c 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61  llows does not a
21d70 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20  ppear in normal 
21d80 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  builds..**.** Th
21d90 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
21da0 20 75 73 65 64 20 74 6f 20 70 72 69 6e 74 20 6f   used to print o
21db0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ut the content o
21dc0 66 20 61 6c 6c 20 6f 72 20 70 61 72 74 20 6f 66  f all or part of
21dd0 20 61 20 0a 2a 2a 20 70 61 72 73 65 20 73 74 72   a .** parse str
21de0 75 63 74 75 72 65 73 20 73 75 63 68 20 61 73 20  uctures such as 
21df0 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72 2e 20  Select or Expr. 
21e00 20 53 75 63 68 20 70 72 69 6e 74 6f 75 74 73 20   Such printouts 
21e10 61 72 65 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f  are useful.** fo
21e20 72 20 68 65 6c 70 69 6e 67 20 74 6f 20 75 6e 64  r helping to und
21e30 65 72 73 74 61 6e 64 20 77 68 61 74 20 69 73 20  erstand what is 
21e40 68 61 70 70 65 6e 69 6e 67 20 69 6e 73 69 64 65  happening inside
21e50 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
21e60 74 6f 72 0a 2a 2a 20 64 75 72 69 6e 67 20 74 68  tor.** during th
21e70 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63  e execution of c
21e80 6f 6d 70 6c 65 78 20 53 45 4c 45 43 54 20 73 74  omplex SELECT st
21e90 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
21ea0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 20 61 72  These routine ar
21eb0 65 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 6e 79  e not called any
21ec0 77 68 65 72 65 20 66 72 6f 6d 20 77 69 74 68 69  where from withi
21ed0 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20  n the normal.** 
21ee0 63 6f 64 65 20 62 61 73 65 2e 20 20 54 68 65 6e  code base.  Then
21ef0 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 74 6f   are intended to
21f00 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
21f10 77 69 74 68 69 6e 20 74 68 65 20 64 65 62 75 67  within the debug
21f20 67 65 72 0a 2a 2a 20 6f 72 20 66 72 6f 6d 20 74  ger.** or from t
21f30 65 6d 70 6f 72 61 72 79 20 22 70 72 69 6e 74 66  emporary "printf
21f40 22 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  " statements ins
21f50 65 72 74 65 64 20 66 6f 72 20 64 65 62 75 67 67  erted for debugg
21f60 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ing..*/.void sql
21f70 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 45 78  ite3PrintExpr(Ex
21f80 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  pr *p){.  if( p-
21f90 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20 70 2d 3e 74  >token.z && p->t
21fa0 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a 20 20 20 20  oken.n>0 ){.    
21fb0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
21fc0 74 66 28 22 28 25 2e 2a 73 22 2c 20 70 2d 3e 74  tf("(%.*s", p->t
21fd0 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74 6f 6b 65 6e  oken.n, p->token
21fe0 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  .z);.  }else{.  
21ff0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22000 69 6e 74 66 28 22 28 25 64 22 2c 20 70 2d 3e 6f  intf("(%d", p->o
22010 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  p);.  }.  if( p-
22020 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 73 71  >pLeft ){.    sq
22030 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
22040 28 22 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  (" ");.    sqlit
22050 65 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70  e3PrintExpr(p->p
22060 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Left);.  }.  if(
22070 20 70 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20   p->pRight ){.  
22080 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
22090 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73  intf(" ");.    s
220a0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
220b0 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  p->pRight);.  }.
220c0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
220d0 69 6e 74 66 28 22 29 22 29 3b 0a 7d 0a 76 6f 69  intf(")");.}.voi
220e0 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78  d sqlite3PrintEx
220f0 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
22100 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
22110 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
22120 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
22130 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  ){.    sqlite3Pr
22140 69 6e 74 45 78 70 72 28 70 4c 69 73 74 2d 3e 61  intExpr(pList->a
22150 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
22160 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  if( i<pList->nEx
22170 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  pr-1 ){.      sq
22180 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
22190 28 22 2c 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  (", ");.    }.  
221a0 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
221b0 50 72 69 6e 74 53 65 6c 65 63 74 28 53 65 6c 65  PrintSelect(Sele
221c0 63 74 20 2a 70 2c 20 69 6e 74 20 69 6e 64 65 6e  ct *p, int inden
221d0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 62  t){.  sqlite3Deb
221e0 75 67 50 72 69 6e 74 66 28 22 25 2a 73 53 45 4c  ugPrintf("%*sSEL
221f0 45 43 54 28 25 70 29 20 22 2c 20 69 6e 64 65 6e  ECT(%p) ", inden
22200 74 2c 20 22 22 2c 20 70 29 3b 0a 20 20 73 71 6c  t, "", p);.  sql
22210 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
22220 74 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  t(p->pEList);.  
22230 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
22240 74 66 28 22 5c 6e 22 29 3b 0a 20 20 69 66 28 20  tf("\n");.  if( 
22250 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 63  p->pSrc ){.    c
22260 68 61 72 20 2a 7a 50 72 65 66 69 78 3b 0a 20 20  har *zPrefix;.  
22270 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 7a 50 72    int i;.    zPr
22280 65 66 69 78 20 3d 20 22 46 52 4f 4d 22 3b 0a 20  efix = "FROM";. 
22290 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
222a0 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
222b0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
222c0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
222d0 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
222e0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
222f0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
22300 25 2a 73 20 22 2c 20 69 6e 64 65 6e 74 2b 36 2c  %*s ", indent+6,
22310 20 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20   zPrefix);.     
22320 20 7a 50 72 65 66 69 78 20 3d 20 22 22 3b 0a 20   zPrefix = "";. 
22330 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
22340 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
22350 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
22360 72 69 6e 74 66 28 22 28 5c 6e 22 29 3b 0a 20 20  rintf("(\n");.  
22370 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 69        sqlite3Pri
22380 6e 74 53 65 6c 65 63 74 28 70 49 74 65 6d 2d 3e  ntSelect(pItem->
22390 70 53 65 6c 65 63 74 2c 20 69 6e 64 65 6e 74 2b  pSelect, indent+
223a0 31 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  10);.        sql
223b0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
223c0 22 25 2a 73 29 22 2c 20 69 6e 64 65 6e 74 2b 38  "%*s)", indent+8
223d0 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , "");.      }el
223e0 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e  se if( pItem->zN
223f0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
22400 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
22410 66 28 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  f("%s", pItem->z
22420 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
22430 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
22440 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
22450 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
22460 74 66 28 22 28 74 61 62 6c 65 3a 20 25 73 29 22  tf("(table: %s)"
22470 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
22480 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
22490 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
224a0 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
224b0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
224c0 69 6e 74 66 28 22 20 41 53 20 25 73 22 2c 20 70  intf(" AS %s", p
224d0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
224e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
224f0 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
22500 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  -1 ){.        sq
22510 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
22520 28 22 2c 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (",");.      }. 
22530 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
22540 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
22550 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
22560 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
22570 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
22580 74 66 28 22 25 2a 73 20 57 48 45 52 45 20 22 2c  tf("%*s WHERE ",
22590 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20   indent, "");.  
225a0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
225b0 70 72 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  pr(p->pWhere);. 
225c0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
225d0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
225e0 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75 70  .  if( p->pGroup
225f0 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
22600 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
22610 73 20 47 52 4f 55 50 20 42 59 20 22 2c 20 69 6e  s GROUP BY ", in
22620 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
22630 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c  qlite3PrintExprL
22640 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 29  ist(p->pGroupBy)
22650 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
22660 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
22670 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48 61    }.  if( p->pHa
22680 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  ving ){.    sqli
22690 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
226a0 25 2a 73 20 48 41 56 49 4e 47 20 22 2c 20 69 6e  %*s HAVING ", in
226b0 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73  dent, "");.    s
226c0 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
226d0 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  p->pHaving);.   
226e0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
226f0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
22700 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
22710 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
22720 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
22730 4f 52 44 45 52 20 42 59 20 22 2c 20 69 6e 64 65  ORDER BY ", inde
22740 6e 74 2c 20 22 22 29 3b 0a 20 20 20 20 73 71 6c  nt, "");.    sql
22750 69 74 65 33 50 72 69 6e 74 45 78 70 72 4c 69 73  ite3PrintExprLis
22760 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  t(p->pOrderBy);.
22770 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
22780 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
22790 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68  }.}./* End of th
227a0 65 20 73 74 72 75 63 74 75 72 65 20 64 65 62 75  e structure debu
227b0 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a  g printing code.
227c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
22810 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
22820 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
22830 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
22840 44 45 42 55 47 29 20 2a 2f 0a                    DEBUG) */.