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

Artifact d910d7350df0d918e22286c5bfd39d4ea68ec813:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 34 38 30  select.c,v 1.480
0200: 20 32 30 30 38 2f 31 30 2f 30 37 20 31 39 3a 35   2008/10/07 19:5
0210: 33 3a 31 34 20 64 72 68 20 45 78 70 20 24 0a 2a  3: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: 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  pNew->pLimit = p
0a30: 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  Limit;.  pNew->p
0a40: 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
0a50: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
0a60: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
0a70: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0a80: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
0a90: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0aa0: 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66  hm[2] = -1;.  if
0ab0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0ac0: 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72  ed ) {.    clear
0ad0: 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 29  Select(db, pNew)
0ae0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d  ;.    if( pNew!=
0af0: 26 73 74 61 6e 64 69 6e 20 29 20 73 71 6c 69 74  &standin ) sqlit
0b00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
0b10: 77 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  w);.    pNew = 0
0b20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
0b30: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
0b40: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
0b50: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0b60: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
0b70: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
0b80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
0b90: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
0ba0: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
0bb0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
0bc0: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
0bd0: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
0be0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
0bf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
0c00: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
0c10: 66 69 65 72 73 20 70 72 65 63 65 65 64 69 6e 67  fiers preceeding
0c20: 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72   the JOIN keywor
0c30: 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  d, determine the
0c40: 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e  .** type of join
0c50: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
0c60: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  eger constant th
0c70: 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61  at expresses tha
0c80: 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72  t type.** in ter
0c90: 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ms of the follow
0ca0: 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a  ing bit values:.
0cb0: 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e  **.**     JT_INN
0cc0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f  ER.**     JT_CRO
0cd0: 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54  SS.**     JT_OUT
0ce0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54  ER.**     JT_NAT
0cf0: 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c  URAL.**     JT_L
0d00: 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49  EFT.**     JT_RI
0d10: 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c  GHT.**.** A full
0d20: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74   outer join is t
0d30: 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  he combination o
0d40: 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54  f JT_LEFT and JT
0d50: 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  _RIGHT..**.** If
0d60: 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75   an illegal or u
0d70: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
0d80: 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68  type is seen, th
0d90: 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a  en still return.
0da0: 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20  ** a join type, 
0db0: 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72  but put an error
0dc0: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
0dd0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
0de0: 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65   sqlite3JoinType
0df0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0e00: 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e  Token *pA, Token
0e10: 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29   *pB, Token *pC)
0e20: 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65  {.  int jointype
0e30: 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61   = 0;.  Token *a
0e40: 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e  pAll[3];.  Token
0e50: 20 2a 70 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   *p;.  static co
0e60: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
0e70: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79   const char zKey
0e80: 77 6f 72 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20  word[8];.    u8 
0e90: 6e 43 68 61 72 3b 0a 20 20 20 20 75 38 20 63 6f  nChar;.    u8 co
0ea0: 64 65 3b 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73  de;.  } keywords
0eb0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61  [] = {.    { "na
0ec0: 74 75 72 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41  tural", 7, JT_NA
0ed0: 54 55 52 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22  TURAL },.    { "
0ee0: 6c 65 66 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f  left",    4, JT_
0ef0: 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c  LEFT|JT_OUTER },
0f00: 0a 20 20 20 20 7b 20 22 72 69 67 68 74 22 2c 20  .    { "right", 
0f10: 20 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54    5, JT_RIGHT|JT
0f20: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20  _OUTER },.    { 
0f30: 22 66 75 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54  "full",    4, JT
0f40: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a  _LEFT|JT_RIGHT|J
0f50: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0f60: 20 22 6f 75 74 65 72 22 2c 20 20 20 35 2c 20 4a   "outer",   5, J
0f70: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b  T_OUTER },.    {
0f80: 20 22 69 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a   "inner",   5, J
0f90: 54 5f 49 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b  T_INNER },.    {
0fa0: 20 22 63 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a   "cross",   5, J
0fb0: 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53  T_INNER|JT_CROSS
0fc0: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
0fd0: 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20  , j;.  apAll[0] 
0fe0: 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d  = pA;.  apAll[1]
0ff0: 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32   = pB;.  apAll[2
1000: 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d  ] = pC;.  for(i=
1010: 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b  0; i<3 && apAll[
1020: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  i]; i++){.    p 
1030: 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20  = apAll[i];.    
1040: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 69 7a 65 6f  for(j=0; j<sizeo
1050: 66 28 6b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65  f(keywords)/size
1060: 6f 66 28 6b 65 79 77 6f 72 64 73 5b 30 5d 29 3b  of(keywords[0]);
1070: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1080: 20 70 2d 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b   p->n==keywords[
1090: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
10a0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
10b0: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
10c0: 3e 7a 2c 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >z, keywords[j].
10d0: 7a 4b 65 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d  zKeyword, p->n)=
10e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f  =0 ){.        jo
10f0: 69 6e 74 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72  intype |= keywor
1100: 64 73 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20  ds[j].code;.    
1110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1120: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1130: 20 6a 3e 3d 73 69 7a 65 6f 66 28 6b 65 79 77 6f   j>=sizeof(keywo
1140: 72 64 73 29 2f 73 69 7a 65 6f 66 28 6b 65 79 77  rds)/sizeof(keyw
1150: 6f 72 64 73 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ords[0]) ){.    
1160: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54    jointype |= JT
1170: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
1180: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
1190: 20 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74   if(.     (joint
11a0: 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c  ype & (JT_INNER|
11b0: 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f  JT_OUTER))==(JT_
11c0: 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20  INNER|JT_OUTER) 
11d0: 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  ||.     (jointyp
11e0: 65 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30  e & JT_ERROR)!=0
11f0: 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  .  ){.    const 
1200: 63 68 61 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b  char *zSp = " ";
1210: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 21  .    assert( pB!
1220: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  =0 );.    if( pC
1230: 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a  ==0 ){ zSp++; }.
1240: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1250: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
1260: 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72  nown or unsuppor
1270: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22  ted join type: "
1280: 0a 20 20 20 20 20 20 20 22 25 54 20 25 54 25 73  .       "%T %T%s
1290: 25 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70  %T", pA, pB, zSp
12a0: 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  , pC);.    joint
12b0: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
12c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6a 6f 69 6e    }else if( join
12d0: 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54 20  type & JT_RIGHT 
12e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
12f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
1300: 20 20 20 20 20 20 22 52 49 47 48 54 20 61 6e 64        "RIGHT and
1310: 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e   FULL OUTER JOIN
1320: 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e  s are not curren
1330: 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b  tly supported");
1340: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
1350: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20  JT_INNER;.  }.  
1360: 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b  return jointype;
1370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1380: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1390: 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c  column in a tabl
13a0: 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
13b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69   the column.** i
13c0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
13d0: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
13e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75  .static int colu
13f0: 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  mnIndex(Table *p
1400: 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Tab, const char 
1410: 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  *zCol){.  int i;
1420: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
1430: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
1440: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1450: 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f  trICmp(pTab->aCo
1460: 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  l[i].zName, zCol
1470: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
1480: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
1490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
14a0: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 74 6f  he value of a to
14b0: 6b 65 6e 20 74 6f 20 61 20 27 5c 30 30 30 27 2d  ken to a '\000'-
14c0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
14d0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
14e0: 64 20 73 65 74 54 6f 6b 65 6e 28 54 6f 6b 65 6e  d setToken(Token
14f0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1500: 2a 7a 29 7b 0a 20 20 70 2d 3e 7a 20 3d 20 28 75  *z){.  p->z = (u
1510: 38 2a 29 7a 3b 0a 20 20 70 2d 3e 6e 20 3d 20 7a  8*)z;.  p->n = z
1520: 20 3f 20 73 74 72 6c 65 6e 28 7a 29 20 3a 20 30   ? strlen(z) : 0
1530: 3b 0a 20 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a  ;.  p->dyn = 0;.
1540: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1550: 20 74 6f 6b 65 6e 20 74 6f 20 74 68 65 20 64 6f   token to the do
1560: 75 62 6c 65 2d 71 75 6f 74 65 64 20 61 6e 64 20  uble-quoted and 
1570: 65 73 63 61 70 65 64 20 76 65 72 73 69 6f 6e 20  escaped version 
1580: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 70 6f  of the string po
1590: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
15a0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3b 0a 2a  . For example;.*
15b0: 2a 0a 2a 2a 20 20 20 20 7b 61 22 62 63 7d 20 20  *.**    {a"bc}  
15c0: 2d 3e 20 20 7b 22 61 22 22 62 63 22 7d 0a 2a 2f  ->  {"a""bc"}.*/
15d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
15e0: 51 75 6f 74 65 64 54 6f 6b 65 6e 28 50 61 72 73  QuotedToken(Pars
15f0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
1600: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1610: 2a 7a 29 7b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  *z){..  /* Check
1620: 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20 61   if the string a
1630: 70 70 65 61 72 73 20 74 6f 20 62 65 20 71 75 6f  ppears to be quo
1640: 74 65 64 20 75 73 69 6e 67 20 22 2e 2e 2e 22 20  ted using "..." 
1650: 6f 72 20 60 2e 2e 2e 60 0a 20 20 2a 2a 20 6f 72  or `...`.  ** or
1660: 20 5b 2e 2e 2e 5d 20 6f 72 20 27 2e 2e 2e 27 20   [...] or '...' 
1670: 6f 72 20 69 66 20 74 68 65 20 73 74 72 69 6e 67  or if the string
1680: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 22 20   contains any " 
1690: 63 68 61 72 61 63 74 65 72 73 2e 20 20 0a 20 20  characters.  .  
16a0: 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74  ** If it does, t
16b0: 68 65 6e 20 72 65 63 6f 72 64 20 61 20 76 65 72  hen record a ver
16c0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 72 69  sion of the stri
16d0: 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ng with the spec
16e0: 69 61 6c 0a 20 20 2a 2a 20 63 68 61 72 61 63 74  ial.  ** charact
16f0: 65 72 73 20 65 73 63 61 70 65 64 2e 0a 20 20 2a  ers escaped..  *
1700: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1710: 7a 32 20 3d 20 7a 3b 0a 20 20 69 66 28 20 2a 7a  z2 = z;.  if( *z
1720: 32 21 3d 27 5b 27 20 26 26 20 2a 7a 32 21 3d 27  2!='[' && *z2!='
1730: 60 27 20 26 26 20 2a 7a 32 21 3d 27 5c 27 27 20  `' && *z2!='\'' 
1740: 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  ){.    while( *z
1750: 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 2a  2 ){.      if( *
1760: 7a 32 3d 3d 27 22 27 20 29 20 62 72 65 61 6b 3b  z2=='"' ) break;
1770: 0a 20 20 20 20 20 20 7a 32 2b 2b 3b 0a 20 20 20  .      z2++;.   
1780: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 2a 7a   }.  }..  if( *z
1790: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 72 69  2 ){.    /* Stri
17a0: 6e 67 20 63 6f 6e 74 61 69 6e 73 20 22 20 63 68  ng contains " ch
17b0: 61 72 61 63 74 65 72 73 20 2d 20 63 6f 70 79 20  aracters - copy 
17c0: 61 6e 64 20 71 75 6f 74 65 20 74 68 65 20 73 74  and quote the st
17d0: 72 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e  ring. */.    p->
17e0: 7a 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  z = (u8 *)sqlite
17f0: 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
1800: 3e 64 62 2c 20 22 5c 22 25 77 5c 22 22 2c 20 7a  >db, "\"%w\"", z
1810: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 20  );.    if( p->z 
1820: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20  ){.      p->n = 
1830: 73 74 72 6c 65 6e 28 28 63 68 61 72 20 2a 29 70  strlen((char *)p
1840: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ->z);.      p->d
1850: 79 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  yn = 1;.    }.  
1860: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 74  }else{.    /* St
1870: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  ring contains no
1880: 20 22 20 63 68 61 72 61 63 74 65 72 73 20 2d 20   " characters - 
1890: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
18a0: 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 7a 20 3d 20  . */.    p->z = 
18b0: 28 75 38 2a 29 7a 3b 0a 20 20 20 20 70 2d 3e 6e  (u8*)z;.    p->n
18c0: 20 3d 20 28 7a 32 20 2d 20 7a 29 3b 0a 20 20 20   = (z2 - z);.   
18d0: 20 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 20 20 7d   p->dyn = 0;.  }
18e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
18f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e   an expression n
1900: 6f 64 65 20 66 6f 72 20 61 6e 20 69 64 65 6e 74  ode for an ident
1910: 69 66 69 65 72 20 77 69 74 68 20 74 68 65 20 6e  ifier with the n
1920: 61 6d 65 20 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a  ame of zName.*/.
1930: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 43 72 65  Expr *sqlite3Cre
1940: 61 74 65 49 64 45 78 70 72 28 50 61 72 73 65 20  ateIdExpr(Parse 
1950: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
1960: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54  har *zName){.  T
1970: 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 20 20 73 65  oken dummy;.  se
1980: 74 54 6f 6b 65 6e 28 26 64 75 6d 6d 79 2c 20 7a  tToken(&dummy, z
1990: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
19a0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
19b0: 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30  rse, TK_ID, 0, 0
19c0: 2c 20 26 64 75 6d 6d 79 29 3b 0a 7d 0a 0a 2f 2a  , &dummy);.}../*
19d0: 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 74  .** Add a term t
19e0: 6f 20 74 68 65 20 57 48 45 52 45 20 65 78 70 72  o the WHERE expr
19f0: 65 73 73 69 6f 6e 20 69 6e 20 2a 70 70 45 78 70  ession in *ppExp
1a00: 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  r that requires 
1a10: 74 68 65 0a 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75  the.** zCol colu
1a20: 6d 6e 20 74 6f 20 62 65 20 65 71 75 61 6c 20 69  mn to be equal i
1a30: 6e 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  n the two tables
1a40: 20 70 54 61 62 31 20 61 6e 64 20 70 54 61 62 32   pTab1 and pTab2
1a50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a60: 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20   addWhereTerm(. 
1a70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1a90: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1aa0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1ab0: 6f 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ol,        /* Na
1ac0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
1ad0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c   */.  const Tabl
1ae0: 65 20 2a 70 54 61 62 31 2c 20 20 20 20 20 20 2f  e *pTab1,      /
1af0: 2a 20 46 69 72 73 74 20 74 61 62 6c 65 20 2a 2f  * First table */
1b00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b10: 41 6c 69 61 73 31 2c 20 20 20 20 20 2f 2a 20 41  Alias1,     /* A
1b20: 6c 69 61 73 20 66 6f 72 20 66 69 72 73 74 20 74  lias for first t
1b30: 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  able.  May be NU
1b40: 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 61  LL */.  const Ta
1b50: 62 6c 65 20 2a 70 54 61 62 32 2c 20 20 20 20 20  ble *pTab2,     
1b60: 20 2f 2a 20 53 65 63 6f 6e 64 20 74 61 62 6c 65   /* Second table
1b70: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1b80: 20 2a 7a 41 6c 69 61 73 32 2c 20 20 20 20 20 2f   *zAlias2,     /
1b90: 2a 20 41 6c 69 61 73 20 66 6f 72 20 73 65 63 6f  * Alias for seco
1ba0: 6e 64 20 74 61 62 6c 65 2e 20 20 4d 61 79 20 62  nd table.  May b
1bb0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
1bc0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 2c  iRightJoinTable,
1bd0: 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72       /* VDBE cur
1be0: 73 6f 72 20 66 6f 72 20 74 68 65 20 72 69 67 68  sor for the righ
1bf0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  t table */.  Exp
1c00: 72 20 2a 2a 70 70 45 78 70 72 2c 20 20 20 20 20  r **ppExpr,     
1c10: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
1c20: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 74   equality term t
1c30: 6f 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  o this expressio
1c40: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74  n */.  int isOut
1c50: 65 72 4a 6f 69 6e 20 20 20 20 20 20 20 20 20 20  erJoin          
1c60: 2f 2a 20 54 72 75 65 20 69 66 20 64 65 61 6c 69  /* True if deali
1c70: 6e 67 20 77 69 74 68 20 61 6e 20 4f 55 54 45 52  ng with an OUTER
1c80: 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78   join */.){.  Ex
1c90: 70 72 20 2a 70 45 31 61 2c 20 2a 70 45 31 62 2c  pr *pE1a, *pE1b,
1ca0: 20 2a 70 45 31 63 3b 0a 20 20 45 78 70 72 20 2a   *pE1c;.  Expr *
1cb0: 70 45 32 61 2c 20 2a 70 45 32 62 2c 20 2a 70 45  pE2a, *pE2b, *pE
1cc0: 32 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 3b 0a  2c;.  Expr *pE;.
1cd0: 0a 20 20 70 45 31 61 20 3d 20 73 71 6c 69 74 65  .  pE1a = sqlite
1ce0: 33 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50  3CreateIdExpr(pP
1cf0: 61 72 73 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70  arse, zCol);.  p
1d00: 45 32 61 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E2a = sqlite3Cre
1d10: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1d20: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 7a  , zCol);.  if( z
1d30: 41 6c 69 61 73 31 3d 3d 30 20 29 7b 0a 20 20 20  Alias1==0 ){.   
1d40: 20 7a 41 6c 69 61 73 31 20 3d 20 70 54 61 62 31   zAlias1 = pTab1
1d50: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70  ->zName;.  }.  p
1d60: 45 31 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E1b = sqlite3Cre
1d70: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1d80: 2c 20 7a 41 6c 69 61 73 31 29 3b 0a 20 20 69 66  , zAlias1);.  if
1d90: 28 20 7a 41 6c 69 61 73 32 3d 3d 30 20 29 7b 0a  ( zAlias2==0 ){.
1da0: 20 20 20 20 7a 41 6c 69 61 73 32 20 3d 20 70 54      zAlias2 = pT
1db0: 61 62 32 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  ab2->zName;.  }.
1dc0: 20 20 70 45 32 62 20 3d 20 73 71 6c 69 74 65 33    pE2b = sqlite3
1dd0: 43 72 65 61 74 65 49 64 45 78 70 72 28 70 50 61  CreateIdExpr(pPa
1de0: 72 73 65 2c 20 7a 41 6c 69 61 73 32 29 3b 0a 20  rse, zAlias2);. 
1df0: 20 70 45 31 63 20 3d 20 73 71 6c 69 74 65 33 50   pE1c = sqlite3P
1e00: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
1e10: 44 4f 54 2c 20 70 45 31 62 2c 20 70 45 31 61 2c  DOT, pE1b, pE1a,
1e20: 20 30 29 3b 0a 20 20 70 45 32 63 20 3d 20 73 71   0);.  pE2c = sq
1e30: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1e40: 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 45 32 62 2c  e, TK_DOT, pE2b,
1e50: 20 70 45 32 61 2c 20 30 29 3b 0a 20 20 70 45 20   pE2a, 0);.  pE 
1e60: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1e70: 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45  Parse, TK_EQ, pE
1e80: 31 63 2c 20 70 45 32 63 2c 20 30 29 3b 0a 20 20  1c, pE2c, 0);.  
1e90: 69 66 28 20 70 45 20 26 26 20 69 73 4f 75 74 65  if( pE && isOute
1ea0: 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70  rJoin ){.    Exp
1eb0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 2c  rSetProperty(pE,
1ec0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
1ed0: 20 20 20 70 45 2d 3e 69 52 69 67 68 74 4a 6f 69     pE->iRightJoi
1ee0: 6e 54 61 62 6c 65 20 3d 20 69 52 69 67 68 74 4a  nTable = iRightJ
1ef0: 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  oinTable;.  }.  
1f00: 2a 70 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  *ppExpr = sqlite
1f10: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
1f20: 3e 64 62 2c 2a 70 70 45 78 70 72 2c 20 70 45 29  >db,*ppExpr, pE)
1f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1f40: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70  he EP_FromJoin p
1f50: 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74  roperty on all t
1f60: 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65  erms of the give
1f70: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
1f80: 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78 70   And set the Exp
1f90: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
1fa0: 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20  e to iTable for 
1fb0: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
1fc0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  e.** expression.
1fd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72  .**.** The EP_Fr
1fe0: 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20  omJoin property 
1ff0: 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73  is used on terms
2000: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
2010: 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65  n to tell.** the
2020: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
2030: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
2040: 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72 6d  c that this term
2050: 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   is part of the.
2060: 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74  ** join restrict
2070: 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e  ion specified in
2080: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
2090: 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20   clause and not 
20a0: 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  a part.** of the
20b0: 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48   more general WH
20c0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ERE clause.  The
20d0: 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76  se terms are mov
20e0: 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a  ed over to the.*
20f0: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  * WHERE clause d
2100: 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65  uring join proce
2110: 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65  ssing but we nee
2120: 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
2130: 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69  at they.** origi
2140: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
2150: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
2160: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e  .**.** The Expr.
2170: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2180: 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20  tells the WHERE 
2190: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
21a0: 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78  g that the.** ex
21b0: 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73  pression depends
21c0: 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74   on table iRight
21d0: 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69  JoinTable even i
21e0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73 20  f that table is 
21f0: 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c  not.** explicitl
2200: 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  y mentioned in t
2210: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
2220: 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  That information
2230: 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f   is needed.** fo
2240: 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  r cases like thi
2250: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  s:.**.**    SELE
2260: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46  CT * FROM t1 LEF
2270: 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e  T JOIN t2 ON t1.
2280: 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d  a=t2.b AND t1.x=
2290: 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72  5.**.** The wher
22a0: 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74  e clause needs t
22b0: 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64  o defer the hand
22c0: 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78  ling of the t1.x
22d0: 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c  =5.** term until
22e0: 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f   after the t2 lo
22f0: 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  op of the join. 
2300: 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a   In that way, a.
2310: 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77  ** NULL t2 row w
2320: 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
2330: 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35  whenever t1.x!=5
2340: 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a  .  If we do not.
2350: 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  ** defer the han
2360: 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c  dling of t1.x=5,
2370: 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63   it will be proc
2380: 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  essed immediatel
2390: 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74  y.** after the t
23a0: 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20  1 loop and rows 
23b0: 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c  with t1.x!=5 wil
23c0: 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20 69  l never appear i
23d0: 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c  n.** the output,
23e0: 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72   which is incorr
23f0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
2400: 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28  oid setJoinExpr(
2410: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61  Expr *p, int iTa
2420: 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  ble){.  while( p
2430: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
2440: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
2450: 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 2d 3e  omJoin);.    p->
2460: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2470: 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 65  = iTable;.    se
2480: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
2490: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
24a0: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
24b0: 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68    } .}../*.** Th
24c0: 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65  is routine proce
24d0: 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e  sses the join in
24e0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
24f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2500: 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e  ..** ON and USIN
2510: 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63 6f  G clauses are co
2520: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78 74  nverted into ext
2530: 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ra terms of the 
2540: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
2550: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61   NATURAL joins a
2560: 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72 61  lso create extra
2570: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
2580: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  rms..**.** The t
2590: 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20 63  erms of a FROM c
25a0: 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61 69  lause are contai
25b0: 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65 63  ned in the Selec
25c0: 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72 65  t.pSrc structure
25d0: 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f  ..** The left mo
25e0: 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  st table is the 
25f0: 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 53  first entry in S
2600: 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68 65  elect.pSrc.  The
2610: 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74   right-most.** t
2620: 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73 74  able is the last
2630: 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f 69   entry.  The joi
2640: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68 65  n operator is he
2650: 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ld in the entry 
2660: 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20  to.** the left. 
2670: 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63 6f   Thus entry 0 co
2680: 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20  ntains the join 
2690: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  operator for the
26a0: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a   join between.**
26b0: 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20 31   entries 0 and 1
26c0: 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49  .  Any ON or USI
26d0: 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f 63  NG clauses assoc
26e0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6a  iated with the j
26f0: 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20  oin are.** also 
2700: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
2710: 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  left entry..**.*
2720: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2730: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
2740: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
2750: 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  untered..*/.stat
2760: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72 6f  ic int sqlitePro
2770: 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a  cessJoin(Parse *
2780: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2790: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
27a0: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
27b0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62        /* All tab
27c0: 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
27d0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
27e0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2800: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
2810: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2820: 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20  _item *pLeft;   
2830: 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65 20    /* Left table 
2840: 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a  being joined */.
2850: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2860: 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20 20  _item *pRight;  
2870: 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c 65    /* Right table
2880: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
2890: 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ..  pSrc = p->pS
28a0: 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26 70  rc;.  pLeft = &p
28b0: 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69  Src->a[0];.  pRi
28c0: 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b  ght = &pLeft[1];
28d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
28e0: 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c  rc->nSrc-1; i++,
28f0: 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74   pRight++, pLeft
2900: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
2910: 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66 74  pLeftTab = pLeft
2920: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62 6c  ->pTab;.    Tabl
2930: 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20 70  e *pRightTab = p
2940: 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20  Right->pTab;.   
2950: 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20   int isOuter;.. 
2960: 20 20 20 69 66 28 20 70 4c 65 66 74 54 61 62 3d     if( pLeftTab=
2970: 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d  =0 || pRightTab=
2980: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2990: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
29a0: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
29b0: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a 0a   JT_OUTER)!=0;..
29c0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20      /* When the 
29d0: 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 20  NATURAL keyword 
29e0: 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64 20  is present, add 
29f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2a00: 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ms for.    ** ev
2a10: 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  ery column that 
2a20: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 68  the two tables h
2a30: 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20  ave in common.. 
2a40: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
2a50: 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70 65 20 26  ight->jointype &
2a60: 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20   JT_NATURAL ){. 
2a70: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
2a80: 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e  >pOn || pRight->
2a90: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2aa0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2ab0: 67 28 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54  g(pParse, "a NAT
2ac0: 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f  URAL join may no
2ad0: 74 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20  t have ".       
2ae0: 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53      "an ON or US
2af0: 49 4e 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b  ING clause", 0);
2b00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2b10: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
2b20: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66   for(j=0; j<pLef
2b30: 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  tTab->nCol; j++)
2b40: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
2b50: 7a 4e 61 6d 65 20 3d 20 70 4c 65 66 74 54 61 62  zName = pLeftTab
2b60: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
2b70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c  .        if( col
2b80: 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54  umnIndex(pRightT
2b90: 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ab, zName)>=0 ){
2ba0: 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 57 68  .          addWh
2bb0: 65 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ereTerm(pParse, 
2bc0: 7a 4e 61 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c  zName, pLeftTab,
2bd0: 20 70 4c 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20   pLeft->zAlias, 
2be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2c00: 52 69 67 68 74 54 61 62 2c 20 70 52 69 67 68 74  RightTab, pRight
2c10: 2d 3e 7a 41 6c 69 61 73 2c 0a 20 20 20 20 20 20  ->zAlias,.      
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e          pRight->
2c40: 69 43 75 72 73 6f 72 2c 20 26 70 2d 3e 70 57 68  iCursor, &p->pWh
2c50: 65 72 65 2c 20 69 73 4f 75 74 65 72 29 3b 0a 20  ere, isOuter);. 
2c60: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
2c70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2c80: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c  }..    /* Disall
2c90: 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ow both ON and U
2ca0: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20  SING clauses in 
2cb0: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20  the same join.  
2cc0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
2cd0: 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67  ght->pOn && pRig
2ce0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
2cf0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2d00: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
2d10: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
2d20: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
2d30: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
2d40: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
2d50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2d60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2d70: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
2d80: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
2d90: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2da0: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
2db0: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
2dc0: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
2dd0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2de0: 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  n ){.      if( i
2df0: 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e  sOuter ) setJoin
2e00: 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e  Expr(pRight->pOn
2e10: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
2e20: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
2e30: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
2e40: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
2e50: 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67   p->pWhere, pRig
2e60: 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20  ht->pOn);.      
2e70: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b  pRight->pOn = 0;
2e80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
2e90: 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d  reate extra term
2ea0: 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63  s on the WHERE c
2eb0: 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63  lause for each c
2ec0: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20  olumn named.    
2ed0: 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ** in the USING 
2ee0: 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65  clause.  Example
2ef0: 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62  : If the two tab
2f00: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
2f10: 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61   are .    ** A a
2f20: 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49  nd B and the USI
2f30: 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20  NG clause names 
2f40: 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65  X, Y, and Z, the
2f50: 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a  n add this.    *
2f60: 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  * to the WHERE c
2f70: 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e  lause:    A.X=B.
2f80: 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e  X AND A.Y=B.Y AN
2f90: 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a  D A.Z=B.Z.    **
2fa0: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
2fb0: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d   if any column m
2fc0: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
2fd0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a  USING clause is.
2fe0: 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61      ** not conta
2ff0: 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62  ined in both tab
3000: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
3010: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3020: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
3030: 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20  ){.      IdList 
3040: 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d  *pList = pRight-
3050: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
3060: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
3070: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
3080: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
3090: 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  = pList->a[j].zN
30a0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ame;.        if(
30b0: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65   columnIndex(pLe
30c0: 66 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20  ftTab, zName)<0 
30d0: 7c 7c 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  || columnIndex(p
30e0: 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29  RightTab, zName)
30f0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
3100: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3110: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
3120: 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d  join using colum
3130: 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a  n %s - column ".
3140: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74              "not
3150: 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68   present in both
3160: 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29   tables", zName)
3170: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
3180: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
3190: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
31a0: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61  Term(pParse, zNa
31b0: 6d 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c  me, pLeftTab, pL
31c0: 65 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20  eft->zAlias, .  
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e0: 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
31f0: 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41 6c  Tab, pRight->zAl
3200: 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ias,.           
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3220: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
3230: 2c 20 26 70 2d 3e 70 57 68 65 72 65 2c 20 69 73  , &p->pWhere, is
3240: 4f 75 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Outer);.      }.
3250: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3260: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
3270: 6e 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20  nsert code into 
3280: 22 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75  "v" that will pu
3290: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e  sh the record on
32a0: 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
32b0: 2a 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68  ** stack into th
32c0: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61  e sorter..*/.sta
32d0: 74 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74  tic void pushOnt
32e0: 6f 53 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65  oSorter(.  Parse
32f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3300: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
3310: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
3320: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
3330: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
3340: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
3350: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
3360: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
3370: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3380: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
3390: 61 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a            /* 
33a0: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
33b0: 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74   data to be sort
33c0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  ed */.){.  Vdbe 
33d0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
33e0: 62 65 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20  be;.  int nExpr 
33f0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
3400: 72 3b 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65  r;.  int regBase
3410: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
3420: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
3430: 45 78 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72  Expr+2);.  int r
3440: 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
3450: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
3460: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  rse);.  sqlite3E
3470: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
3480: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
3490: 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20  , regBase, 0);. 
34a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34b0: 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
34c0: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43  e, pOrderBy->iEC
34d0: 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e  ursor, regBase+n
34e0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
34f0: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
3500: 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65  rse, regData, re
3510: 67 42 61 73 65 2b 6e 45 78 70 72 2b 31 2c 20 31  gBase+nExpr+1, 1
3520: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
3530: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
3540: 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65  eRecord, regBase
3550: 2c 20 6e 45 78 70 72 20 2b 20 32 2c 20 72 65 67  , nExpr + 2, reg
3560: 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
3570: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3580: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 4f  OP_IdxInsert, pO
3590: 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
35a0: 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
35b0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
35c0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
35d0: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
35e0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
35f0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
3600: 61 73 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20  ase, nExpr+2);. 
3610: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c   if( pSelect->iL
3620: 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  imit ){.    int 
3630: 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20  addr1, addr2;.  
3640: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20    int iLimit;.  
3650: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 69    if( pSelect->i
3660: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
3670: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
3680: 2d 3e 69 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20  ->iOffset+1;.   
3690: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c   }else{.      iL
36a0: 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  imit = pSelect->
36b0: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20  iLimit;.    }.  
36c0: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
36d0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
36e0: 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74  P_IfZero, iLimit
36f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3700: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
3710: 64 64 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d  ddImm, iLimit, -
3720: 31 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  1);.    addr2 = 
3730: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3740: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
3750: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3760: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
3770: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3780: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
3790: 73 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  st, pOrderBy->iE
37a0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
37b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
37c0: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72  , OP_Delete, pOr
37d0: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29  derBy->iECursor)
37e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
37f0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
3800: 72 32 29 3b 0a 20 20 20 20 70 53 65 6c 65 63 74  r2);.    pSelect
3810: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
3820: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63  }.}../*.** Add c
3830: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
3840: 20 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73   the OFFSET.*/.s
3850: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f  tatic void codeO
3860: 66 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76  ffset(.  Vdbe *v
3870: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
3880: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
3890: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65   this VM */.  Se
38a0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
38b0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
38c0: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
38d0: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ded */.  int iCo
38e0: 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75  ntinue     /* Ju
38f0: 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
3900: 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f  the current reco
3910: 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  rd */.){.  if( p
3920: 2d 3e 69 4f 66 66 73 65 74 20 26 26 20 69 43 6f  ->iOffset && iCo
3930: 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20  ntinue!=0 ){.   
3940: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73   int addr;.    s
3950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3960: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70  (v, OP_AddImm, p
3970: 2d 3e 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a  ->iOffset, -1);.
3980: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
3990: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
39a0: 4f 50 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66  OP_IfNeg, p->iOf
39b0: 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  fset);.    sqlit
39c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
39d0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
39e0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
39f0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69  Comment((v, "ski
3a00: 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73  p OFFSET records
3a10: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
3a20: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
3a30: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
3a40: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
3a50: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
3a60: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
3a70: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
3a80: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
3a90: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
3aa0: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
3ab0: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
3ac0: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
3ad0: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
3ae0: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
3af0: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
3b00: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
3b10: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
3b20: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
3b30: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
3b40: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
3b50: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
3b60: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
3b70: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
3b80: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
3b90: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
3ba0: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
3bb0: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
3bc0: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
3bd0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
3be0: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
3bf0: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
3c00: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
3c10: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
3c20: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
3c30: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
3c40: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
3c50: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
3c60: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
3c70: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
3c80: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
3c90: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
3ca0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3cb0: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
3cc0: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
3cd0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
3ce0: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
3cf0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
3d00: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
3d10: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
3d20: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
3d30: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
3d40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
3d50: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
3d60: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
3d70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3d80: 33 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  3(v, OP_Found, i
3d90: 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c  Tab, addrRepeat,
3da0: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   r1);.  sqlite3V
3db0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
3dc0: 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c  IdxInsert, iTab,
3dd0: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52   r1);.  sqlite3R
3de0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
3df0: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
3e00: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
3e10: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68  error message wh
3e20: 65 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75  en a SELECT is u
3e30: 73 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62  sed within a sub
3e40: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65  expression.** (e
3e50: 78 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28  xample:  "a IN (
3e60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
3e70: 62 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61  ble)") but it ha
3e80: 73 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65  s more than 1 re
3e90: 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20  sult.** column. 
3ea0: 20 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61   We do this in a
3eb0: 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61   subroutine beca
3ec0: 75 73 65 20 74 68 65 20 65 72 72 6f 72 20 6f 63  use the error oc
3ed0: 63 75 72 73 20 69 6e 20 6d 75 6c 74 69 70 6c 65  curs in multiple
3ee0: 0a 2a 2a 20 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73  .** places..*/.s
3ef0: 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46  tatic int checkF
3f00: 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c  orMultiColumnSel
3f10: 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73  ectError(.  Pars
3f20: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3f30: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
3f40: 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  t. */.  SelectDe
3f50: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20  st *pDest,   /* 
3f60: 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53  Destination of S
3f70: 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f  ELECT results */
3f80: 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20  .  int nExpr    
3f90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3fa0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
3fb0: 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
3fc0: 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69  SELECT */.){.  i
3fd0: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
3fe0: 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e  ->eDest;.  if( n
3ff0: 45 78 70 72 3e 31 20 26 26 20 28 65 44 65 73 74  Expr>1 && (eDest
4000: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
4010: 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a  st==SRT_Set) ){.
4020: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4030: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c  Msg(pParse, "onl
4040: 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c  y a single resul
4050: 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a  t allowed for ".
4060: 20 20 20 20 20 20 20 22 61 20 53 45 4c 45 43 54         "a SELECT
4070: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
4080: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29   an expression")
4090: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
40a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
40b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
40c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
40d0: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
40e0: 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69  ode for the insi
40f0: 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20  de of the inner 
4100: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c  loop.** of a SEL
4110: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72  ECT..**.** If sr
4120: 63 54 61 62 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e  cTab and nColumn
4130: 20 61 72 65 20 62 6f 74 68 20 7a 65 72 6f 2c 20   are both zero, 
4140: 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20  then the pEList 
4150: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
4160: 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  re evaluated in 
4170: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
4180: 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72   data for this r
4190: 6f 77 2e 20 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e  ow.  If nColumn>
41a0: 30 0a 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 69  0.** then data i
41b0: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
41c0: 63 54 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20  cTab and pEList 
41d0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 20  is used only to 
41e0: 67 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 74  get the.** datat
41f0: 79 70 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f  ypes for each co
4200: 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lumn..*/.static 
4210: 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72  void selectInner
4220: 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Loop(.  Parse *p
4230: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
4240: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
4250: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
4260: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
4270: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65     /* The comple
4280: 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  te select statem
4290: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ent being coded 
42a0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
42b0: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
42c0: 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62  List of values b
42d0: 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a  eing extracted *
42e0: 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20  /.  int srcTab, 
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4300: 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ull data from th
4310: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  is table */.  in
4320: 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t nColumn,      
4330: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4340: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
4350: 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 2a  e source table *
4360: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
4370: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 49  rderBy,     /* I
4380: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f 72 74  f not NULL, sort
4390: 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67 20 74   results using t
43a0: 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  his key */.  int
43b0: 20 64 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20   distinct,      
43c0: 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20       /* If >=0, 
43d0: 6d 61 6b 65 20 73 75 72 65 20 72 65 73 75 6c 74  make sure result
43e0: 73 20 61 72 65 20 64 69 73 74 69 6e 63 74 20 2a  s are distinct *
43f0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
4400: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48  pDest,      /* H
4410: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
4420: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
4430: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
4440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4450: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
4460: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
4470: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4490: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
44a0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
44b0: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a  nner loop */.){.
44c0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
44d0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
44e0: 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   i;.  int hasDis
44f0: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
4500: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
4510: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
4520: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
4530: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
4540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
4550: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
4560: 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20  ding result set 
4570: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
4580: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
4590: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
45a0: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
45b0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
45c0: 44 65 73 74 2d 3e 69 50 61 72 6d 3b 20 20 20 2f  Dest->iParm;   /
45d0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
45e0: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
45f0: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
4600: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
4610: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4620: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
4630: 20 2a 2f 0a 0a 20 20 69 66 28 20 76 3d 3d 30 20   */..  if( v==0 
4640: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
4650: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
4660: 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74 20 3d  .  hasDistinct =
4670: 20 64 69 73 74 69 6e 63 74 3e 3d 30 3b 0a 20 20   distinct>=0;.  
4680: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
4690: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
46a0: 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  ){.    codeOffse
46b0: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
46c0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75  e);.  }..  /* Pu
46d0: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
46e0: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
46f0: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
4700: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4710: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
4720: 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74  lse{.    nResult
4730: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
4740: 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  xpr;.  }.  if( p
4750: 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b  Dest->iMem==0 ){
4760: 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 4d 65 6d  .    pDest->iMem
4770: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
4780: 31 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 4d  1;.    pDest->nM
4790: 65 6d 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  em = nResultCol;
47a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
47b0: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
47c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65  .  }else if( pDe
47d0: 73 74 2d 3e 6e 4d 65 6d 21 3d 6e 52 65 73 75 6c  st->nMem!=nResul
47e0: 74 43 6f 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  tCol ){.    /* T
47f0: 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
4800: 20 74 77 6f 20 53 45 4c 45 43 54 73 20 6f 66 20   two SELECTs of 
4810: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
4820: 54 20 68 61 76 65 20 64 69 66 66 65 72 69 6e 67  T have differing
4830: 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 20  .    ** numbers 
4840: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
4850: 73 2e 20 20 54 68 65 20 65 72 72 6f 72 20 6d 65  s.  The error me
4860: 73 73 61 67 65 20 77 69 6c 6c 20 62 65 20 67 65  ssage will be ge
4870: 6e 65 72 61 74 65 64 20 62 79 0a 20 20 20 20 2a  nerated by.    *
4880: 2a 20 61 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  * a higher-level
4890: 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20   routine. */.   
48a0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72   return;.  }.  r
48b0: 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74  egResult = pDest
48c0: 2d 3e 69 4d 65 6d 3b 0a 20 20 69 66 28 20 6e 43  ->iMem;.  if( nC
48d0: 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66  olumn>0 ){.    f
48e0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
48f0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  n; i++){.      s
4900: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4910: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
4920: 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73  rcTab, i, regRes
4930: 75 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20  ult+i);.    }.  
4940: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21  }else if( eDest!
4950: 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20  =SRT_Exists ){. 
4960: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
4970: 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45  tination is an E
4980: 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65  XISTS(...) expre
4990: 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61  ssion, the actua
49a0: 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  l.    ** values 
49b0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
49c0: 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72  SELECT are not r
49d0: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
49e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
49f0: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
4a00: 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52  se, pEList, regR
4a10: 65 73 75 6c 74 2c 20 65 44 65 73 74 3d 3d 53 52  esult, eDest==SR
4a20: 54 5f 4f 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20  T_Output);.  }. 
4a30: 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75   nColumn = nResu
4a40: 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20  ltCol;..  /* If 
4a50: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
4a60: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
4a70: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
4a80: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
4a90: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
4aa0: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
4ab0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
4ac0: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
4ad0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
4ae0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
4af0: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
4b00: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
4b10: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
4b20: 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
4b30: 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ==nColumn );.   
4b40: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
4b50: 61 72 73 65 2c 20 64 69 73 74 69 6e 63 74 2c 20  arse, distinct, 
4b60: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75  iContinue, nColu
4b70: 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a  mn, regResult);.
4b80: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4b90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ==0 ){.      cod
4ba0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43  eOffset(v, p, iC
4bb0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
4bc0: 20 20 7d 0a 0a 20 20 69 66 28 20 63 68 65 63 6b    }..  if( check
4bd0: 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65  ForMultiColumnSe
4be0: 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
4bf0: 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d  , pDest, pEList-
4c00: 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 72  >nExpr) ){.    r
4c10: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 77  eturn;.  }..  sw
4c20: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
4c30: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
4c40: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
4c50: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
4c60: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
4c70: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
4c80: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
4c90: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
4ca0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
4cb0: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
4cc0: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
4cd0: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
4ce0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
4cf0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
4d00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4d10: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
4d20: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
4d30: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  sult, nColumn, r
4d40: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
4d50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4d60: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
4d70: 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  rm, r1);.      s
4d80: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4d90: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
4da0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4db0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e     }..    /* Con
4dc0: 73 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20  struct a record 
4dd0: 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72  from the query r
4de0: 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65  esult, but inste
4df0: 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76  ad of.    ** sav
4e00: 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c  ing that record,
4e10: 20 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79   use it as a key
4e20: 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65   to delete eleme
4e30: 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  nts from.    ** 
4e40: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
4e50: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
4e60: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
4e70: 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73  xcept: {.      s
4e80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4e90: 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65  (v, OP_IdxDelete
4ea0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75  , iParm, regResu
4eb0: 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  lt, nColumn);.  
4ec0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ed0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
4ee0: 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
4ef0: 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
4f00: 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
4f10: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
4f20: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
4f30: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
4f40: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
4f50: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
4f60: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
4f70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4f80: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
4f90: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
4fa0: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
4fb0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
4fc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68   ){.        push
4fd0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
4fe0: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
4ff0: 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r1);.      }else
5000: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32  {.        int r2
5010: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5020: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5040: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
5050: 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72  wRowid, iParm, r
5060: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
5070: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5080: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
5090: 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20  m, r1, r2);.    
50a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
50b0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
50c0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
50d0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
50e0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
50f0: 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
5100: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5110: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5120: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
5130: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
5140: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5150: 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
5160: 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
5170: 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
5180: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
5190: 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
51a0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
51b0: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
51c0: 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
51d0: 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
51e0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
51f0: 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
5200: 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
5210: 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
5220: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
5230: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
5240: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
5250: 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20    p->affinity = 
5260: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
5270: 66 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61  finity(pEList->a
5280: 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74  [0].pExpr, pDest
5290: 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20  ->affinity);.   
52a0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
52b0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
52c0: 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f   first glance yo
52d0: 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65  u would think we
52e0: 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20   could optimize 
52f0: 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  out the.        
5300: 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74  ** ORDER BY in t
5310: 68 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74  his case since t
5320: 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72  he order of entr
5330: 69 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20  ies in the set. 
5340: 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e         ** does n
5350: 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20  ot matter.  But 
5360: 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61  there might be a
5370: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69   LIMIT clause, i
5380: 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
5390: 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65  ** case the orde
53a0: 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f  r does matter */
53b0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
53c0: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
53d0: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67  pOrderBy, p, reg
53e0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
53f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
5400: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
5410: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5420: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5430: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
5440: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
5450: 67 52 65 73 75 6c 74 2c 20 31 2c 20 72 31 2c 20  gResult, 1, r1, 
5460: 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20 31 29  &p->affinity, 1)
5470: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
5480: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
5490: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
54a0: 20 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a   regResult, 1);.
54b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
54c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
54d0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
54e0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
54f0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
5500: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
5510: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5520: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5530: 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
5540: 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
5550: 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
5560: 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
5570: 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
5580: 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
5590: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
55a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
55b0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61  _Integer, 1, iPa
55c0: 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  rm);.      /* Th
55d0: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
55e0: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
55f0: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
5600: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5610: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
5620: 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
5630: 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
5640: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
5650: 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
5660: 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
5670: 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
5680: 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
5690: 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
56a0: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
56b0: 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
56c0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
56d0: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
56e0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
56f0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
5700: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
5710: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
5720: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
5730: 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  p, regResult);. 
5740: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5750: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
5760: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
5770: 72 65 67 52 65 73 75 6c 74 2c 20 69 50 61 72 6d  regResult, iParm
5780: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  , 1);.        /*
5790: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
57a0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
57b0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
57c0: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
57d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
57e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
57f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5800: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
5810: 2f 2a 20 53 65 6e 64 20 74 68 65 20 64 61 74 61  /* Send the data
5820: 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
5830: 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20   function or to 
5840: 61 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49  a subroutine.  I
5850: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73  n the.    ** cas
5860: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
5870: 65 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  e, the subroutin
5880: 65 20 69 74 73 65 6c 66 20 69 73 20 72 65 73 70  e itself is resp
5890: 6f 6e 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20  onsible for.    
58a0: 2a 2a 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64  ** popping the d
58b0: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ata from the sta
58c0: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ck..    */.    c
58d0: 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
58e0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
58f0: 4f 75 74 70 75 74 3a 20 7b 0a 20 20 20 20 20 20  Output: {.      
5900: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
5910: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
5920: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
5930: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
5940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5950: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
5960: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
5970: 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b  t, nColumn, r1);
5980: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
5990: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
59a0: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29  pOrderBy, p, r1)
59b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
59c0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
59d0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
59e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65     }else if( eDe
59f0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
5a00: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
5a10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
5a20: 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
5a30: 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  t->iParm);.     
5a40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5a50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5a60: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
5a70: 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  w, regResult, nC
5a80: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
5a90: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
5aa0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
5ab0: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
5ac0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
5ad0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5ae0: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  .    }..#if !def
5af0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5b00: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a  _TRIGGER).    /*
5b10: 20 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73   Discard the res
5b20: 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75  ults.  This is u
5b30: 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73  sed for SELECT s
5b40: 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65  tatements inside
5b50: 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79  .    ** the body
5b60: 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20   of a TRIGGER.  
5b70: 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73  The purpose of s
5b80: 75 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74  uch selects is t
5b90: 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73  o call.    ** us
5ba0: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
5bb0: 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73  ions that have s
5bc0: 69 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65  ide effects.  We
5bd0: 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20   do not care.   
5be0: 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63   ** about the ac
5bf0: 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20  tual results of 
5c00: 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20  the select..    
5c10: 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
5c20: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5c30: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
5c40: 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rd );.      brea
5c50: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
5c60: 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
5c70: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
5c80: 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d   loop if the LIM
5c90: 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20  IT is reached.. 
5ca0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   */.  if( p->iLi
5cb0: 6d 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  mit ){.    asser
5cc0: 74 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t( pOrderBy==0 )
5cd0: 3b 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  ;  /* If there i
5ce0: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  s an ORDER BY, t
5cf0: 68 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20  he call to.     
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d10: 20 20 20 20 20 20 20 2a 2a 20 70 75 73 68 4f 6e         ** pushOn
5d20: 74 6f 53 6f 72 74 65 72 28 29 20 77 6f 75 6c 64  toSorter() would
5d30: 20 68 61 76 65 20 63 6c 65 61 72 65 64 20 70 2d   have cleared p-
5d40: 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 73  >iLimit */.    s
5d50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5d60: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70  (v, OP_AddImm, p
5d70: 2d 3e 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20  ->iLimit, -1);. 
5d80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5d90: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp2(v, OP_IfZer
5da0: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
5db0: 72 65 61 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  reak);.  }.}../*
5dc0: 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
5dd0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65  ression list, ge
5de0: 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  nerate a KeyInfo
5df0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
5e00: 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63  records.** the c
5e10: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
5e20: 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65  e for each expre
5e30: 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78  ssion in that ex
5e40: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
5e50: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72  *.** If the Expr
5e60: 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52  List is an ORDER
5e70: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
5e80: 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20  clause then the 
5e90: 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79  resulting.** Key
5ea0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
5eb0: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
5ec0: 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  r initializing a
5ed0: 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74   virtual index t
5ee0: 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74  o.** implement t
5ef0: 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20  hat clause.  If 
5f00: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
5f10: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
5f20: 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68  f a SELECT.** th
5f30: 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  en the KeyInfo s
5f40: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
5f50: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
5f60: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
5f70: 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69  al.** index to i
5f80: 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49  mplement a DISTI
5f90: 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20  NCT test..**.** 
5fa0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
5fb0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
5fc0: 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72  ure is obtain fr
5fd0: 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20  om malloc.  The 
5fe0: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
5ff0: 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ion is responsib
6000: 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68  le for seeing th
6010: 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
6020: 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
6030: 2a 2a 20 66 72 65 65 64 2e 20 20 41 64 64 20 74  ** freed.  Add t
6040: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
6050: 74 75 72 65 20 74 6f 20 74 68 65 20 50 34 20 66  ture to the P4 f
6060: 69 65 6c 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64  ield of an opcod
6070: 65 20 75 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45  e using.** P4_KE
6080: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73  YINFO_HANDOFF is
6090: 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 20 6f   the usual way o
60a0: 66 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 74  f dealing with t
60b0: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  his..*/.static K
60c0: 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46  eyInfo *keyInfoF
60d0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73  romExprList(Pars
60e0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
60f0: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73  ist *pList){.  s
6100: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
6110: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
6120: 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Expr;.  KeyInfo 
6130: 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  *pInfo;.  struct
6140: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
6150: 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
6160: 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  .  nExpr = pList
6170: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f  ->nExpr;.  pInfo
6180: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6190: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
61a0: 66 28 2a 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70  f(*pInfo) + nExp
61b0: 72 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  r*(sizeof(CollSe
61c0: 71 2a 29 2b 31 29 20 29 3b 0a 20 20 69 66 28 20  q*)+1) );.  if( 
61d0: 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e  pInfo ){.    pIn
61e0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  fo->aSortOrder =
61f0: 20 28 75 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43   (u8*)&pInfo->aC
6200: 6f 6c 6c 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20  oll[nExpr];.    
6210: 70 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20  pInfo->nField = 
6220: 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e 66 6f  nExpr;.    pInfo
6230: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
6240: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
6250: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
6260: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
6270: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  m++){.      Coll
6280: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
6290: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
62a0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
62b0: 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
62c0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  r);.      if( !p
62d0: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
62e0: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
62f0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
6300: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
6310: 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[i] = pColl;.  
6320: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
6330: 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d  Order[i] = pItem
6340: 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ->sortOrder;.   
6350: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6360: 70 49 6e 66 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pInfo;.}.../*.**
6370: 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   If the inner lo
6380: 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64  op was generated
6390: 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c   using a non-nul
63a0: 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d  l pOrderBy argum
63b0: 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ent,.** then the
63c0: 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c   results were pl
63d0: 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72  aced in a sorter
63e0: 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f  .  After the loo
63f0: 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a  p is terminated.
6400: 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75  ** we need to ru
6410: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64  n the sorter and
6420: 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75   output the resu
6430: 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  lts.  The follow
6440: 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  ing.** routine g
6450: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
6460: 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74  e needed to do t
6470: 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  hat..*/.static v
6480: 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74  oid generateSort
6490: 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70  Tail(.  Parse *p
64a0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
64b0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
64c0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
64d0: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
64e0: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
64f0: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
6500: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
6510: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44  ode into this VD
6520: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  BE */.  int nCol
6530: 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d  umn,      /* Num
6540: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f  ber of columns o
6550: 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  f data */.  Sele
6560: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a  ctDest *pDest /*
6570: 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65   Write the sorte
6580: 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  d results here *
6590: 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 72 6b 20 3d  /.){.  int brk =
65a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
65b0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e 74 20  Label(v);.  int 
65c0: 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  cont = sqlite3Vd
65d0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
65e0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e    int addr;.  in
65f0: 74 20 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73  t iTab;.  int ps
6600: 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45  eudoTab = 0;.  E
6610: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
6620: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
6630: 0a 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  ..  int eDest = 
6640: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20  pDest->eDest;.  
6650: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73  int iParm = pDes
6660: 74 2d 3e 69 50 61 72 6d 3b 0a 0a 20 20 69 6e 74  t->iParm;..  int
6670: 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72   regRow;.  int r
6680: 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62  egRowid;..  iTab
6690: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43   = pOrderBy->iEC
66a0: 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65  ursor;.  if( eDe
66b0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
66c0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
66d0: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73  outine ){.    ps
66e0: 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65  eudoTab = pParse
66f0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71  ->nTab++;.    sq
6700: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6710: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
6720: 6d 6e 73 2c 20 30 2c 20 6e 43 6f 6c 75 6d 6e 29  mns, 0, nColumn)
6730: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6740: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
6750: 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f  enPseudo, pseudo
6760: 54 61 62 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f  Tab, eDest==SRT_
6770: 4f 75 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 61  Output);.  }.  a
6780: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
6790: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
67a0: 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 62 72  P_Sort, iTab, br
67b0: 6b 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74  k);.  codeOffset
67c0: 28 76 2c 20 70 2c 20 63 6f 6e 74 29 3b 0a 20 20  (v, p, cont);.  
67d0: 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  regRow = sqlite3
67e0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
67f0: 65 29 3b 0a 20 20 72 65 67 52 6f 77 69 64 20 3d  e);.  regRowid =
6800: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6810: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
6820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6830: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
6840: 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ab, pOrderBy->nE
6850: 78 70 72 20 2b 20 31 2c 20 72 65 67 52 6f 77 29  xpr + 1, regRow)
6860: 3b 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ;.  switch( eDes
6870: 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52  t ){.    case SR
6880: 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73  T_Table:.    cas
6890: 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20  e SRT_EphemTab: 
68a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
68b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
68c0: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
68d0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
68e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
68f0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
6900: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c  , iParm, regRow,
6910: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
6920: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6930: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
6940: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62  APPEND);.      b
6950: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
6960: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6970: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
6980: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
6990: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
69a0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
69b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
69c0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
69d0: 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65  d, regRow, 1, re
69e0: 67 52 6f 77 69 64 2c 20 26 70 2d 3e 61 66 66 69  gRowid, &p->affi
69f0: 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
6a00: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
6a10: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
6a20: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31  Parse, regRow, 1
6a30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6a40: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6a50: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
6a60: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
6a70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6a80: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
6a90: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
6aa0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
6ab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
6ac0: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
6ad0: 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d  e, regRow, iParm
6ae0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
6af0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
6b00: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
6b10: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
6b20: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
6b30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
6b40: 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a  case SRT_Output:
6b50: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
6b60: 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20  routine: {.     
6b70: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 71   int i;.      sq
6b80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6b90: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
6ba0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
6bb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6bc0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
6bd0: 74 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 72 65  t, pseudoTab, re
6be0: 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b  gRow, regRowid);
6bf0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
6c00: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
6c10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6c20: 20 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e   regRow!=pDest->
6c30: 69 4d 65 6d 2b 69 20 29 3b 0a 20 20 20 20 20 20  iMem+i );.      
6c40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6c50: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
6c60: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20  , pseudoTab, i, 
6c70: 70 44 65 73 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a  pDest->iMem+i);.
6c80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6c90: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
6ca0: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  put ){.        s
6cb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6cc0: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
6cd0: 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e  , pDest->iMem, n
6ce0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
6cf0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
6d00: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
6d10: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69  pParse, pDest->i
6d20: 4d 65 6d 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Mem, nColumn);. 
6d30: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6d40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6d50: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
6d60: 64 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29  d, pDest->iParm)
6d70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6d80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6d90: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6da0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
6db0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
6dc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
6dd0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
6de0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
6df0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
6e00: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
6e10: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20  e, regRowid);.. 
6e20: 20 2f 2a 20 4c 49 4d 49 54 20 68 61 73 20 62 65   /* LIMIT has be
6e30: 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  en implemented b
6e40: 79 20 74 68 65 20 70 75 73 68 4f 6e 74 6f 53 6f  y the pushOntoSo
6e50: 72 74 65 72 28 29 20 72 6f 75 74 69 6e 65 2e 0a  rter() routine..
6e60: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
6e70: 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 0a  ->iLimit==0 );..
6e80: 20 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20    /* The bottom 
6e90: 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f  of the loop.  */
6ea0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
6eb0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 63 6f  solveLabel(v, co
6ec0: 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  nt);.  sqlite3Vd
6ed0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
6ee0: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
6ef0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
6f00: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 62  esolveLabel(v, b
6f10: 72 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74  rk);.  if( eDest
6f20: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
6f30: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6f40: 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tine ){.    sqli
6f50: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6f60: 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64   OP_Close, pseud
6f70: 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d  oTab, 0);.  }..}
6f80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
6f90: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
6fa0: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
6fb0: 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e  the 'declaration
6fc0: 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a   type' of the.**
6fd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
6fe0: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  r. The string ma
6ff0: 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  y be treated as 
7000: 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61  static by the ca
7010: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ller..**.** The 
7020: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
7030: 20 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61   is the exact da
7040: 74 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f  tatype definitio
7050: 6e 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  n extracted from
7060: 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
7070: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
7080: 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65  atement if the e
7090: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
70a0: 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65  olumn. The.** de
70b0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66  claration type f
70c0: 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64  or a ROWID field
70d0: 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61   is INTEGER. Exa
70e0: 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70  ctly when an exp
70f0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  ression.** is co
7100: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
7110: 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78  n can be complex
7120: 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65   in the presence
7130: 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20   of subqueries. 
7140: 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65  The.** result-se
7150: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  t expression in 
7160: 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
7170: 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74  wing SELECT stat
7180: 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f  ements is .** co
7190: 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d  nsidered a colum
71a0: 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  n by this functi
71b0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  on..**.**   SELE
71c0: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
71d0: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
71e0: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
71f0: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
7200: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
7210: 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43  tbl);.**   SELEC
7220: 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45  T abc FROM (SELE
7230: 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52  CT col AS abc FR
7240: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20  OM tbl);.** .** 
7250: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
7260: 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70  type for any exp
7270: 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68  ression other th
7280: 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e  an a column is N
7290: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ULL..*/.static c
72a0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
72b0: 6e 54 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e  nType(.  NameCon
72c0: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78  text *pNC, .  Ex
72d0: 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e  pr *pExpr,.  con
72e0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
72f0: 69 6e 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  inDb,.  const ch
7300: 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62  ar **pzOriginTab
7310: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7320: 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a  *pzOriginCol.){.
7330: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54    char const *zT
7340: 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ype = 0;.  char 
7350: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62  const *zOriginDb
7360: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
7370: 73 74 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d  st *zOriginTab =
7380: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
7390: 20 2a 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30   *zOriginCol = 0
73a0: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28  ;.  int j;.  if(
73b0: 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 43   pExpr==0 || pNC
73c0: 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ->pSrcList==0 ) 
73d0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 73 77 69  return 0;..  swi
73e0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
73f0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
7400: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
7410: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
7420: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
7430: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
7440: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
7450: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
7460: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
7470: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
7480: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
7490: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
74a0: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
74b0: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
74c0: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
74d0: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
74e0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
74f0: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
7500: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
7510: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
7520: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
7530: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
7540: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
7550: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
7560: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
7570: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
7580: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
7590: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
75a0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
75b0: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
75c0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20       while( pNC 
75d0: 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
75e0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61      SrcList *pTa
75f0: 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  bList = pNC->pSr
7600: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  cList;.        f
7610: 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73  or(j=0;j<pTabLis
7620: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
7630: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
7640: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
7650: 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69  ;j++);.        i
7660: 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  f( j<pTabList->n
7670: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
7680: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
7690: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
76a0: 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62         pS = pTab
76b0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65  List->a[j].pSele
76c0: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ct;.        }els
76d0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  e{.          pNC
76e0: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
76f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7700: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
7710: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
7720: 2a 20 46 49 58 20 4d 45 3a 0a 20 20 20 20 20 20  * FIX ME:.      
7730: 20 20 2a 2a 20 54 68 69 73 20 63 61 6e 20 6f 63    ** This can oc
7740: 63 75 72 73 20 69 66 20 79 6f 75 20 68 61 76 65  curs if you have
7750: 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20   something like 
7760: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 3b 22 20  "SELECT new.x;" 
7770: 69 6e 73 69 64 65 0a 20 20 20 20 20 20 20 20 2a  inside.        *
7780: 2a 20 61 20 74 72 69 67 67 65 72 2e 20 20 49 6e  * a trigger.  In
7790: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
77a0: 20 79 6f 75 20 72 65 66 65 72 65 6e 63 65 20 74   you reference t
77b0: 68 65 20 73 70 65 63 69 61 6c 20 22 6e 65 77 22  he special "new"
77c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
77d0: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
77e0: 73 65 74 20 6f 66 20 61 20 73 65 6c 65 63 74 2e  set of a select.
77f0: 20 20 57 65 20 64 6f 20 6e 6f 74 20 68 61 76 65    We do not have
7800: 20 61 20 67 6f 6f 64 20 77 61 79 0a 20 20 20 20   a good way.    
7810: 20 20 20 20 2a 2a 20 74 6f 20 66 69 6e 64 20 74      ** to find t
7820: 68 65 20 61 63 74 75 61 6c 20 74 61 62 6c 65 20  he actual table 
7830: 74 79 70 65 2c 20 73 6f 20 63 61 6c 6c 20 69 74  type, so call it
7840: 20 22 54 45 58 54 22 2e 20 20 54 68 69 73 20 69   "TEXT".  This i
7850: 73 20 72 65 61 6c 6c 79 0a 20 20 20 20 20 20 20  s really.       
7860: 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 66   ** something of
7870: 20 61 20 62 75 67 2c 20 62 75 74 20 49 20 64 6f   a bug, but I do
7880: 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f   not know how to
7890: 20 66 69 78 20 69 74 2e 0a 20 20 20 20 20 20 20   fix it..       
78a0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
78b0: 68 69 73 20 63 6f 64 65 20 64 6f 65 73 20 6e 6f  his code does no
78c0: 74 20 70 72 6f 64 75 63 65 20 74 68 65 20 63 6f  t produce the co
78d0: 72 72 65 63 74 20 61 6e 73 77 65 72 20 2d 20 69  rrect answer - i
78e0: 74 20 6a 75 73 74 20 70 72 65 76 65 6e 74 73 0a  t just prevents.
78f0: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73 65 67          ** a seg
7900: 66 61 75 6c 74 2e 20 20 53 65 65 20 74 69 63 6b  fault.  See tick
7910: 65 74 20 23 31 32 32 39 2e 0a 20 20 20 20 20 20  et #1229..      
7920: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 54 79    */.        zTy
7930: 70 65 20 3d 20 22 54 45 58 54 22 3b 0a 20 20 20  pe = "TEXT";.   
7940: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7950: 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
7960: 74 28 20 70 54 61 62 20 29 3b 0a 20 20 20 20 20  t( pTab );.     
7970: 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20   if( pS ){.     
7980: 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65     /* The "table
7990: 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  " is actually a 
79a0: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20  sub-select or a 
79b0: 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d  view in the FROM
79c0: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
79d0: 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ** of the SELECT
79e0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75   statement. Retu
79f0: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
7a00: 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67  on type and orig
7a10: 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  in.        ** da
7a20: 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ta for the resul
7a30: 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  t-set column of 
7a40: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a  the sub-select..
7a50: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
7a60: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26     if( iCol>=0 &
7a70: 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73  & iCol<pS->pELis
7a80: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
7a90: 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c        /* If iCol
7aa0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
7ab0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ro, then the exp
7ac0: 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73  ression requests
7ad0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
7ae0: 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73  * rowid of the s
7af0: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65  ub-select or vie
7b00: 77 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69  w. This expressi
7b10: 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65  on is legal (see
7b20: 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
7b30: 65 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32  est case misc2.2
7b40: 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20  .2) - it always 
7b50: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
7b60: 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  L..          */.
7b70: 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f            NameCo
7b80: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
7b90: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
7ba0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  S->pEList->a[iCo
7bb0: 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  l].pExpr;.      
7bc0: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
7bd0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
7be0: 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74         sNC.pNext
7bf0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
7c00: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
7c10: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
7c20: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
7c30: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
7c40: 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72  &zOriginDb, &zOr
7c50: 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69  iginTab, &zOrigi
7c60: 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 20 20  nCol); .        
7c70: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
7c80: 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ( pTab->pSchema 
7c90: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
7ca0: 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  real table */.  
7cb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
7cc0: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  S );.        if(
7cd0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
7ce0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
7cf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
7d00: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
7d10: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
7d20: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
7d30: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
7d40: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
7d50: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
7d60: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 43 6f         zOriginCo
7d70: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
7d80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7d90: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
7da0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
7db0: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
7dc0: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70 54 61  zOriginCol = pTa
7dd0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
7de0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ame;.        }. 
7df0: 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e 54 61         zOriginTa
7e00: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
7e10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43  .        if( pNC
7e20: 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20  ->pParse ){.    
7e30: 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
7e40: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
7e50: 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65  ndex(pNC->pParse
7e60: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
7e70: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
7e80: 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e 43 2d  zOriginDb = pNC-
7e90: 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62  >pParse->db->aDb
7ea0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
7eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7ec0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7ed0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
7ee0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
7ef0: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
7f00: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
7f10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
7f20: 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65  a sub-select. Re
7f30: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
7f40: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20  tion type and.  
7f50: 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e      ** origin in
7f60: 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c  fo for the singl
7f70: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
7f80: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
7f90: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a  e SELECT.      *
7fa0: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  * statement..   
7fb0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65     */.      Name
7fc0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
7fd0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
7fe0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a  pExpr->pSelect;.
7ff0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
8000: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  pS->pEList->a[0]
8010: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 4e  .pExpr;.      sN
8020: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
8030: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43  >pSrc;.      sNC
8040: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
8050: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
8060: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
8070: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
8080: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
8090: 26 7a 4f 72 69 67 69 6e 44 62 2c 20 26 7a 4f 72  &zOriginDb, &zOr
80a0: 69 67 69 6e 54 61 62 2c 20 26 7a 4f 72 69 67 69  iginTab, &zOrigi
80b0: 6e 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72  nCol); .      br
80c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
80d0: 66 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70  f.  }.  .  if( p
80e0: 7a 4f 72 69 67 69 6e 44 62 20 29 7b 0a 20 20 20  zOriginDb ){.   
80f0: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 69   assert( pzOrigi
8100: 6e 54 61 62 20 26 26 20 70 7a 4f 72 69 67 69 6e  nTab && pzOrigin
8110: 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72  Col );.    *pzOr
8120: 69 67 69 6e 44 62 20 3d 20 7a 4f 72 69 67 69 6e  iginDb = zOrigin
8130: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69  Db;.    *pzOrigi
8140: 6e 54 61 62 20 3d 20 7a 4f 72 69 67 69 6e 54 61  nTab = zOriginTa
8150: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e  b;.    *pzOrigin
8160: 43 6f 6c 20 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c  Col = zOriginCol
8170: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
8180: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Type;.}../*.** G
8190: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
81a0: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
81b0: 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61  VDBE the declara
81c0: 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f  tion types of co
81d0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
81e0: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
81f0: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
8200: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a  ateColumnTypes(.
8210: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8220: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
8230: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
8240: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
8250: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
8260: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
8270: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
8280: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
8290: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
82a0: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  et */.){.#ifndef
82b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
82c0: 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20  LTYPE.  Vdbe *v 
82d0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
82e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
82f0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
8300: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
8310: 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50  abList;.  sNC.pP
8320: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
8330: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
8340: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
8350: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
8360: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
8370: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
8380: 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66  r *zType;.#ifdef
8390: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
83a0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
83b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
83c0: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
83d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
83e0: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
83f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
8400: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70  ol = 0;.    zTyp
8410: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
8420: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
8430: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
8440: 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a  rigCol);..    /*
8450: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
8460: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
8470: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
8480: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
8490: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
84a0: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
84b0: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
84c0: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
84d0: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
84e0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
84f0: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
8500: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8510: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8520: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
8530: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 50 34 5f 54  E, zOrigDb, P4_T
8540: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
8550: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8560: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8570: 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54  ME_TABLE, zOrigT
8580: 61 62 2c 20 50 34 5f 54 52 41 4e 53 49 45 4e 54  ab, P4_TRANSIENT
8590: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
85a0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
85b0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d  i, COLNAME_COLUM
85c0: 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 50 34 5f  N, zOrigCol, P4_
85d0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73  TRANSIENT);.#els
85e0: 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  e.    zType = co
85f0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
8600: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  , 0, 0, 0);.#end
8610: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
8620: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
8630: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54  i, COLNAME_DECLT
8640: 59 50 45 2c 20 7a 54 79 70 65 2c 20 50 34 5f 54  YPE, zType, P4_T
8650: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
8660: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8670: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 20 2a 2f  OMIT_DECLTYPE */
8680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
8690: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
86a0: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
86b0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
86c0: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
86d0: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73  esult set.  This
86e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
86f0: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
8700: 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76  the.** azCol[] v
8710: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  alues in the cal
8720: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
8730: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
8740: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
8750: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8760: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
8770: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
8780: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
8790: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
87a0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
87b0: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
87c0: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
87d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
87e0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
87f0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
8800: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
8810: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
8820: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
8830: 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d  lNames, shortNam
8840: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
8850: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
8860: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
8870: 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69   an EXPLAIN, ski
8880: 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20  p this step */. 
8890: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
88a0: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  lain ){.    retu
88b0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
88c0: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
88d0: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
88e0: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 76  colNamesSet || v
88f0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
8900: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
8910: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  ;.  pParse->colN
8920: 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66  amesSet = 1;.  f
8930: 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ullNames = (db->
8940: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
8950: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b  ullColNames)!=0;
8960: 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20  .  shortNames = 
8970: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
8980: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
8990: 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  s)!=0;.  sqlite3
89a0: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76  VdbeSetNumCols(v
89b0: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
89c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
89d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
89e0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b  +){.    Expr *p;
89f0: 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d  .    p = pEList-
8a00: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
8a10: 20 69 66 28 20 70 3d 3d 30 20 29 20 63 6f 6e 74   if( p==0 ) cont
8a20: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45  inue;.    if( pE
8a30: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8a40: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
8a50: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
8a60: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
8a70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8a80: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8a90: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
8aa0: 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  e, strlen(zName)
8ab0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
8ac0: 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   (p->op==TK_COLU
8ad0: 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  MN || p->op==TK_
8ae0: 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70  AGG_COLUMN) && p
8af0: 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  TabList ){.     
8b00: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
8b10: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
8b20: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
8b30: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
8b40: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
8b50: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20  abList->nSrc && 
8b60: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
8b70: 43 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c  Cursor!=p->iTabl
8b80: 65 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  e; j++){}.      
8b90: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
8ba0: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
8bb0: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
8bc0: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
8bd0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
8be0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
8bf0: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
8c00: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
8c10: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
8c20: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
8c30: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
8c40: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
8c50: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
8c60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8c70: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
8c80: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
8c90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8ca0: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
8cb0: 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20  !fullNames ){.  
8cc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8cd0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8ce0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8cf0: 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a  (char*)p->span.z
8d00: 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20  , p->span.n);.  
8d10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75      }else if( fu
8d20: 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73 68 6f  llNames || (!sho
8d30: 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61 62 4c  rtNames && pTabL
8d40: 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29 7b 0a  ist->nSrc>1) ){.
8d50: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
8d60: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
8d70: 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20 0a 20   char *zTab;. . 
8d80: 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70 54         zTab = pT
8d90: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 41 6c  abList->a[j].zAl
8da0: 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ias;.        if(
8db0: 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 7a 54   fullNames || zT
8dc0: 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d 20 70  ab==0 ) zTab = p
8dd0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
8de0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
8df0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
8e00: 25 73 2e 25 73 22 2c 20 7a 54 61 62 2c 20 7a 43  %s.%s", zTab, zC
8e10: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
8e20: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
8e30: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
8e40: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 50 34  _NAME, zName, P4
8e50: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
8e60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8e70: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
8e80: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
8e90: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20  AME_NAME, zCol, 
8ea0: 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 29 3b 0a 20  strlen(zCol));. 
8eb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8ec0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8ed0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
8ee0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
8ef0: 2c 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e  , (char*)p->span
8f00: 2e 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 3b 0a  .z, p->span.n);.
8f10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
8f20: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
8f30: 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
8f40: 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 23 69  , pEList);.}..#i
8f50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8f60: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
8f70: 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20  T./*.** Name of 
8f80: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
8f90: 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f  perator, used fo
8fa0: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
8fb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
8fc0: 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70  t char *selectOp
8fd0: 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20  Name(int id){.  
8fe0: 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63  char *z;.  switc
8ff0: 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73  h( id ){.    cas
9000: 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20  e TK_ALL:       
9010: 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b  z = "UNION ALL";
9020: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9030: 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a  se TK_INTERSECT:
9040: 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22   z = "INTERSECT"
9050: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
9060: 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20  ase TK_EXCEPT:  
9070: 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20    z = "EXCEPT"; 
9080: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9090: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
90a0: 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20     z = "UNION"; 
90b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
90c0: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
90d0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
90e0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
90f0: 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  LECT */../*.** G
9100: 69 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65 73  iven a an expres
9110: 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68  sion list (which
9120: 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c   is really the l
9130: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
9140: 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20  ns.** that form 
9150: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
9160: 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
9170: 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70  ment) compute ap
9180: 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c  propriate.** col
9190: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20  umn names for a 
91a0: 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64  table that would
91b0: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
91c0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
91d0: 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   All column name
91e0: 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65  s will be unique
91f0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
9200: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72   column names ar
9210: 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c  e computed.  Col
9220: 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d  umn.zType, Colum
9230: 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20  n.zColl,.** and 
9240: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
9250: 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65  Column are zeroe
9260: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
9270: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
9280: 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f  cess.  If a memo
9290: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
92a0: 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73  ror occurs,.** s
92b0: 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61  tore NULL in *pa
92c0: 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e  Col and 0 in *pn
92d0: 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Col and return S
92e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
92f0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
9300: 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
9310: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
9320: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
9330: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
9340: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
9350: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
9360: 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72 6f  /* Expr list fro
9370: 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69 76  m which to deriv
9380: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
9390: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20  /.  int *pnCol, 
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
93b0: 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
93c0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20  of columns here 
93d0: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61  */.  Column **pa
93e0: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Col          /* 
93f0: 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63 6f  Write the new co
9400: 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20 2a  lumn list here *
9410: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
9420: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9430: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 63 6e 74  .  int i, j, cnt
9440: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  ;.  Column *aCol
9450: 2c 20 2a 70 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e  , *pCol;.  int n
9460: 43 6f 6c 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  Col;.  Expr *p;.
9470: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
9480: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 2a   int nName;..  *
9490: 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 20 3d 20 70  pnCol = nCol = p
94a0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
94b0: 61 43 6f 6c 20 3d 20 2a 70 61 43 6f 6c 20 3d 20  aCol = *paCol = 
94c0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
94d0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61  ero(db, sizeof(a
94e0: 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20  Col[0])*nCol);. 
94f0: 20 69 66 28 20 61 43 6f 6c 3d 3d 30 20 29 20 72   if( aCol==0 ) r
9500: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
9510: 45 4d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  EM;.  for(i=0, p
9520: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c  Col=aCol; i<nCol
9530: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
9540: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
9550: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
9560: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
9570: 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 45 4c    */.    p = pEL
9580: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
9590: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
95a0: 70 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70 2d 3e  pRight==0 || p->
95b0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d  pRight->token.z=
95c0: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d  =0 || p->pRight-
95d0: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 21 3d 30 20 29  >token.z[0]!=0 )
95e0: 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  ;.    if( (zName
95f0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
9600: 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
9610: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
9620: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
9630: 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
9640: 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
9650: 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
9660: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
9670: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
9680: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
9690: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
96a0: 43 6f 6c 20 3d 20 70 3b 0a 20 20 20 20 20 20 54  Col = p;.      T
96b0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
96c0: 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 2d 3e 6f    while( pCol->o
96d0: 70 3d 3d 54 4b 5f 44 4f 54 20 29 20 70 43 6f 6c  p==TK_DOT ) pCol
96e0: 20 3d 20 70 43 6f 6c 2d 3e 70 52 69 67 68 74 3b   = pCol->pRight;
96f0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d  .      if( pCol-
9700: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
9710: 26 20 28 70 54 61 62 20 3d 20 70 43 6f 6c 2d 3e  & (pTab = pCol->
9720: 70 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20 20  pTab)!=0 ){.    
9730: 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d      /* For colum
9740: 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d  ns use the colum
9750: 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20  n name name */. 
9760: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
9770: 3d 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3b  = pCol->iColumn;
9780: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
9790: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
97a0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
97b0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
97c0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
97d0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
97e0: 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54      iCol>=0 ? pT
97f0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
9800: 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29 3b  Name : "rowid");
9810: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9820: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
9830: 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f   original text o
9840: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70  f the column exp
9850: 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e  ression as its n
9860: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  ame */.        z
9870: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
9880: 72 69 6e 74 66 28 64 62 2c 20 22 25 54 22 2c 20  rintf(db, "%T", 
9890: 26 70 43 6f 6c 2d 3e 73 70 61 6e 29 3b 0a 20 20  &pCol->span);.  
98a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
98b0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
98c0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  iled ){.      sq
98d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
98e0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
98f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eak;.    }.    s
9900: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
9910: 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  ame);..    /* Ma
9920: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
9930: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
9940: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
9950: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
9960: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
9970: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
9980: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
9990: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
99a0: 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d    */.    nName =
99b0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a   strlen(zName);.
99c0: 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b      for(j=cnt=0;
99d0: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
99e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
99f0: 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  ICmp(aCol[j].zNa
9a00: 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  me, zName)==0 ){
9a10: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
9a20: 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  NewName;.       
9a30: 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20   zName[nName] = 
9a40: 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e  0;.        zNewN
9a50: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
9a60: 69 6e 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22  intf(db, "%s:%d"
9a70: 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b  , zName, ++cnt);
9a80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9a90: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
9aa0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  );.        zName
9ab0: 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20   = zNewName;.   
9ac0: 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20       j = -1;.   
9ad0: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d       if( zName==
9ae0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
9af0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f   }.    }.    pCo
9b00: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  l->zName = zName
9b10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
9b20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
9b30: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 66      int j;.    f
9b40: 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  or(j=0; j<i; j++
9b50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9b60: 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b  DbFree(db, aCol[
9b70: 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  j].zName);.    }
9b80: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
9b90: 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20  ee(db, aCol);.  
9ba0: 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20    *paCol = 0;.  
9bb0: 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20    *pnCol = 0;.  
9bc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9bd0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74  NOMEM;.  }.  ret
9be0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
9bf0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65  ../*.** Add type
9c00: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
9c10: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20  nformation to a 
9c20: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65  column list base
9c30: 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54  d on.** a SELECT
9c40: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a   statement..** .
9c50: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
9c60: 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61  st presumably ca
9c70: 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f  me from selectCo
9c80: 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70  lumnNamesFromExp
9c90: 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20  rList()..** The 
9ca0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20  column list has 
9cb0: 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20  only names, not 
9cc0: 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69  types or collati
9cd0: 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ons.  This.** ro
9ce0: 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75  utine goes throu
9cf0: 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20  gh and adds the 
9d00: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
9d10: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
9d20: 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65   routine require
9d30: 73 20 74 68 61 74 20 61 6c 6c 20 69 6e 64 65 6e  s that all inden
9d40: 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
9d50: 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
9d60: 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
9d70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
9d80: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
9d90: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
9da0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9db0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
9dc0: 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
9dd0: 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20   int nCol,      
9de0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9df0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20   of columns */. 
9e00: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20   Column *aCol,  
9e10: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
9e20: 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53  f columns */.  S
9e30: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
9e40: 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75       /* SELECT u
9e50: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
9e60: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
9e70: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  tions */.){.  sq
9e80: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9e90: 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f  se->db;.  NameCo
9ea0: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c  ntext sNC;.  Col
9eb0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c  umn *pCol;.  Col
9ec0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
9ed0: 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b  nt i;.  Expr *p;
9ee0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
9ef0: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61  st_item *a;..  a
9f00: 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d  ssert( pSelect!=
9f10: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
9f20: 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
9f30: 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29  s & SF_Resolved)
9f40: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
9f50: 20 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e   nCol==pSelect->
9f60: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c  pEList->nExpr ||
9f70: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9f80: 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  d );.  if( db->m
9f90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
9fa0: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26  turn;.  memset(&
9fb0: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
9fc0: 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63  NC));.  sNC.pSrc
9fd0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
9fe0: 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c  pSrc;.  a = pSel
9ff0: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a  ect->pEList->a;.
a000: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
a010: 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  aCol; i<nCol; i+
a020: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
a030: 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  p = a[i].pExpr;.
a040: 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20      pCol->zType 
a050: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
a060: 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65  p(db, columnType
a070: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
a080: 30 29 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  0));.    pCol->a
a090: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
a0a0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
a0b0: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
a0c0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
a0d0: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
a0e0: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
a0f0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
a100: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
a110: 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
a120: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  me);.    }.  }.}
a130: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
a140: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
a150: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62  , generate a Tab
a160: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
a170: 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74  t describes.** t
a180: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
a190: 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f   that SELECT..*/
a1a0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52  .Table *sqlite3R
a1b0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
a1c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
a1d0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
a1e0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
a1f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a200: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
a210: 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a  nt savedFlags;..
a220: 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64    savedFlags = d
a230: 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e  b->flags;.  db->
a240: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
a250: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20  _FullColNames;. 
a260: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
a270: 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
a280: 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  es;.  sqlite3Sel
a290: 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
a2a0: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
a2b0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
a2c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68  ) return 0;.  wh
a2d0: 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
a2e0: 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
a2f0: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
a300: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20  ;.  db->flags = 
a310: 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54  savedFlags;.  pT
a320: 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
a330: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
a340: 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
a350: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
a360: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a370: 0a 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62  .  pTab->db = db
a380: 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d  ;.  pTab->nRef =
a390: 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
a3a0: 65 20 3d 20 30 3b 0a 20 20 73 65 6c 65 63 74 43  e = 0;.  selectC
a3b0: 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
a3c0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
a3d0: 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  ct->pEList, &pTa
a3e0: 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
a3f0: 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41  aCol);.  selectA
a400: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
a410: 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
a420: 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
a430: 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 65 63 74  b->aCol, pSelect
a440: 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  );.  pTab->iPKey
a450: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d   = -1;.  if( db-
a460: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
a470: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65  .    sqlite3Dele
a480: 74 65 54 61 62 6c 65 28 70 54 61 62 29 3b 0a 20  teTable(pTab);. 
a490: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a4a0: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
a4b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
a4c0: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
a4d0: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
a4e0: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
a4f0: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
a500: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
a510: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
a520: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
a530: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
a540: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
a550: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
a560: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
a570: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a580: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
a590: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
a5a0: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
a5b0: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
a5c0: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e  Parse->db);.#ifn
a5d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a5e0: 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 76 20  TRACE.    if( v 
a5f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a600: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
a610: 5f 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23  _Trace);.    }.#
a620: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
a630: 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn v;.}.../*.** 
a640: 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
a650: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
a660: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
a670: 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
a680: 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
a690: 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
a6a0: 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20  ns.  pLimit and 
a6b0: 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  pOffset hold the
a6c0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
a6d0: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
a6e0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
a6f0: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
a700: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
a710: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
a720: 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
a730: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
a740: 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
a750: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
a760: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
a770: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
a780: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
a790: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
a7a0: 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
a7b0: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
a7c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
a7d0: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
a7e0: 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
a7f0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
a800: 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
a810: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a820: 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
a830: 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61  lues of iLimit a
a840: 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
a850: 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
a860: 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
a870: 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64  ed by pLimit and
a880: 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   pOffset.  iLimi
a890: 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
a8a0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
a8b0: 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
a8c0: 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
a8d0: 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c  values.** (usual
a8e0: 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79  ly but not alway
a8f0: 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63  s -1) prior to c
a900: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
a910: 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ine..** Only if 
a920: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
a930: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
a940: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
a950: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
a960: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
a970: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
a980: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
a990: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
a9a0: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
a9b0: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
a9c0: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
a9d0: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
a9e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
a9f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
aa00: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
aa10: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
aa20: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
aa30: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
aa40: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
aa50: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
aa60: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
aa70: 20 61 64 64 72 31 3b 0a 20 20 69 66 28 20 70 2d   addr1;.  if( p-
aa80: 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >iLimit ) return
aa90: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c  ;..  /* .  ** "L
aaa0: 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20  IMIT -1" always 
aab0: 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20  shows all rows. 
aac0: 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20   There is some. 
aad0: 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72 73 79 20   ** contraversy 
aae0: 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63  about what the c
aaf0: 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
ab00: 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20  should be..  ** 
ab10: 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
ab20: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72  ementation inter
ab30: 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20  prets "LIMIT 0" 
ab40: 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20  to mean.  ** no 
ab50: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rows..  */.  if(
ab60: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
ab70: 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c    p->iLimit = iL
ab80: 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  imit = ++pParse-
ab90: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73  >nMem;.    v = s
aba0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
abb0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
abc0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
abd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
abe0: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
abf0: 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
ac00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ac10: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
ac20: 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  Int, iLimit);.  
ac30: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
ac40: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
ac50: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
ac60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ac70: 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c  _IfZero, iLimit,
ac80: 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a 20 20   iBreak);.  }.  
ac90: 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29  if( p->pOffset )
aca0: 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74  {.    p->iOffset
acb0: 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70   = iOffset = ++p
acc0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
acd0: 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
ace0: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
acf0: 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c  nMem++;   /* All
ad00: 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72  ocate an extra r
ad10: 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69  egister for limi
ad20: 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  t+offset */.    
ad30: 7d 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  }.    v = sqlite
ad40: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
ad50: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
ad60: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
ad70: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ad80: 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c  rse, p->pOffset,
ad90: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73   iOffset);.    s
ada0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
adb0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
adc0: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
add0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
ade0: 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22  "OFFSET counter"
adf0: 29 29 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20  ));.    addr1 = 
ae00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ae10: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  1(v, OP_IfPos, i
ae20: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c  Offset);.    sql
ae30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ae40: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
ae50: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73   iOffset);.    s
ae60: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
ae70: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
ae80: 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
ae90: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
aea0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
aeb0: 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f  _Add, iLimit, iO
aec0: 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31  ffset, iOffset+1
aed0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
aee0: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b  ment((v, "LIMIT+
aef0: 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20  OFFSET"));.     
af00: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
af10: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
af20: 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b  _IfPos, iLimit);
af30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
af40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
af50: 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66  nteger, -1, iOff
af60: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  set+1);.      sq
af70: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
af80: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
af90: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
afa0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
afb0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
afc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
afd0: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
afe0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
aff0: 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  r the iCol-th co
b000: 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72  lumn of.** the r
b010: 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68  esult set for th
b020: 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  e compound-selec
b030: 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e  t statement "p".
b040: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
b050: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  .** the column h
b060: 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  as no default co
b070: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
b080: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
b090: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
b0a0: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  or the compound 
b0b0: 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20  select is taken 
b0c0: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74  from the.** left
b0d0: 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68  -most term of th
b0e0: 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61  e select that ha
b0f0: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
b100: 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
b110: 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69  c CollSeq *multi
b120: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61  SelectCollSeq(Pa
b130: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
b140: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  ect *p, int iCol
b150: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52  ){.  CollSeq *pR
b160: 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  et;.  if( p->pPr
b170: 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ior ){.    pRet 
b180: 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
b190: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
b1a0: 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20  pPrior, iCol);. 
b1b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74   }else{.    pRet
b1c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
b1d0: 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pRet==0 ){.    p
b1e0: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Ret = sqlite3Exp
b1f0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
b200: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43   p->pEList->a[iC
b210: 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  ol].pExpr);.  }.
b220: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
b230: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b240: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
b250: 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f  SELECT */../* Fo
b260: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
b270: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
b280: 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
b290: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b2a0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
b2b0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
b2c0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
b2d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
b2e0: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
b2f0: 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
b300: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
b310: 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
b320: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
b330: 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
b340: 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  );...#ifndef SQL
b350: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
b360: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54  D_SELECT./*.** T
b370: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
b380: 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73  alled to process
b390: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
b3a0: 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74  y form from.** t
b3b0: 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
b3c0: 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e  ate queries usin
b3d0: 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41  g UNION, UNION A
b3e0: 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a  LL, EXCEPT, or.*
b3f0: 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a  * INTERSECT.**.*
b400: 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20  * "p" points to 
b410: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  the right-most o
b420: 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65  f the two querie
b430: 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e  s.  the query on
b440: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20   the.** left is 
b450: 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20  p->pPrior.  The 
b460: 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64  left query could
b470: 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f   also be a compo
b480: 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20  und query.** in 
b490: 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20  which case this 
b4a0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
b4b0: 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
b4c0: 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ly. .**.** The r
b4d0: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f  esults of the to
b4e0: 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f  tal query are to
b4f0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
b500: 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a   a destination.*
b510: 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20  * of type eDest 
b520: 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  with parameter i
b530: 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  Parm..**.** Exam
b540: 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72  ple 1:  Consider
b550: 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d   a three-way com
b560: 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d  pound SQL statem
b570: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ent..**.**     S
b580: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
b590: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46  UNION SELECT b F
b5a0: 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM t2 UNION SEL
b5b0: 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
b5c0: 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65  .** This stateme
b5d0: 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20  nt is parsed up 
b5e0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
b5f0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  *     SELECT c F
b600: 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c  ROM t3.**      |
b610: 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e  .**      `----->
b620: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
b630: 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t2.**           
b640: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
b650: 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d           `------
b660: 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  >  SELECT a FROM
b670: 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72   t1.**.** The ar
b680: 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67  rows in the diag
b690: 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73  ram above repres
b6a0: 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70  ent the Select.p
b6b0: 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a  Prior pointer..*
b6c0: 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  * So if this rou
b6d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
b6e0: 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74  ith p equal to t
b6f0: 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65  he t3 query, the
b700: 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c  n.** pPrior will
b710: 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79   be the t2 query
b720: 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65  .  p->op will be
b730: 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69   TK_UNION in thi
b740: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  s case..**.** No
b750: 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73  tice that becaus
b760: 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c  e of the way SQL
b770: 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f  ite parses compo
b780: 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65  und SELECTs, the
b790: 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73  .** individual s
b7a0: 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72  elects always gr
b7b0: 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  oup from left to
b7c0: 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
b7d0: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
b7e0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
b7f0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
b800: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
b810: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
b820: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b830: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
b840: 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
b850: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
b860: 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
b870: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
b880: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
b890: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
b8a0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53  QLITE_OK;   /* S
b8b0: 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d  uccess code from
b8c0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
b8d0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f  .  Select *pPrio
b8e0: 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74  r;       /* Anot
b8f0: 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64  her SELECT immed
b900: 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65  iately to our le
b910: 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ft */.  Vdbe *v;
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b930: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b940: 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20  o this VDBE */. 
b950: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
b960: 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  ;      /* Altern
b970: 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69  ative data desti
b980: 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  nation */.  Sele
b990: 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b  ct *pDelete = 0;
b9a0: 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69    /* Chain of si
b9b0: 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20  mple selects to 
b9c0: 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69  delete */.  sqli
b9d0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
b9e0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
b9f0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  nnection */..  /
ba00: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
ba10: 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
ba20: 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   or LIMIT clause
ba30: 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
ba40: 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68  s.  Only.  ** th
ba50: 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f  e last (right-mo
ba60: 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68  st) SELECT in th
ba70: 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
ba80: 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
ba90: 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61   LIMIT..  */.  a
baa0: 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70  ssert( p && p->p
bab0: 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c  Prior );  /* Cal
bac0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75  ling function gu
bad0: 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75  arantees this mu
bae0: 63 68 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  ch */.  db = pPa
baf0: 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f  rse->db;.  pPrio
bb00: 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
bb10: 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
bb20: 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50 72  >pRightmost!=pPr
bb30: 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ior );.  assert(
bb40: 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d   pPrior->pRightm
bb50: 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d 6f  ost==p->pRightmo
bb60: 73 74 20 29 3b 0a 20 20 64 65 73 74 20 3d 20 2a  st );.  dest = *
bb70: 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
bb80: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ior->pOrderBy ){
bb90: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
bba0: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44  rMsg(pParse,"ORD
bbb0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f  ER BY clause sho
bbc0: 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
bbd0: 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
bbe0: 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
bbf0: 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
bc00: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
bc10: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
bc20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69  ;.  }.  if( pPri
bc30: 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  or->pLimit ){.  
bc40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
bc50: 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20  g(pParse,"LIMIT 
bc60: 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
bc70: 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
bc80: 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
bc90: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
bca0: 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
bcb0: 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
bcc0: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
bcd0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
bce0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
bcf0: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
bd00: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c    /* The VDBE al
bd10: 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79  ready created by
bd20: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
bd30: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74  n */..  /* Creat
bd40: 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  e the destinatio
bd50: 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
bd60: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20  e if necessary. 
bd70: 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65   */.  if( dest.e
bd80: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
bd90: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
bda0: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
bdb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bdc0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
bdd0: 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69  phemeral, dest.i
bde0: 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  Parm, p->pEList-
bdf0: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73  >nExpr);.    des
be00: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
be10: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ble;.  }..  /* M
be20: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
be30: 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
be40: 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
be50: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
be60: 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
be70: 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
be80: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
be90: 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
bea0: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
beb0: 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
bec0: 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e  >nExpr!=pPrior->
bed0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
bee0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
bef0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
bf00: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
bf10: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
bf20: 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
bf30: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
bf40: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
bf50: 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
bf60: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
bf70: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
bf80: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
bf90: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f  ct_end;.  }..  /
bfa0: 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  * Compound SELEC
bfb0: 54 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20  Ts that have an 
bfc0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
bfd0: 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
bfe0: 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  rately..  */.  i
bff0: 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
c000: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c  {.    return mul
c010: 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
c020: 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
c030: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
c040: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
c050: 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
c060: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
c070: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74  nts..  */.  swit
c080: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
c090: 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
c0a0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
c0b0: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
c0c0: 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  ( !pPrior->pLimi
c0d0: 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  t );.      pPrio
c0e0: 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r->pLimit = p->p
c0f0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
c100: 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  ior->pOffset = p
c110: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
c120: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
c130: 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
c140: 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  or, &dest);.    
c150: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
c160: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
c170: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
c180: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
c190: 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
c1a0: 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _end;.      }.  
c1b0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
c1c0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d  0;.      p->iLim
c1d0: 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69  it = pPrior->iLi
c1e0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  mit;.      p->iO
c1f0: 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e  ffset = pPrior->
c200: 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  iOffset;.      i
c210: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
c220: 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
c230: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c240: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70  (v, OP_IfZero, p
c250: 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->iLimit);.     
c260: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
c270: 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69  v, "Jump ahead i
c280: 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22  f LIMIT reached"
c290: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
c2a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
c2b0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
c2c0: 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 44  &dest);.      pD
c2d0: 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
c2e0: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
c2f0: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
c300: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
c310: 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
c320: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
c330: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64    }.      if( ad
c340: 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dr ){.        sq
c350: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c360: 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
c370: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
c380: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c390: 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63  TK_EXCEPT:.    c
c3a0: 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a  ase TK_UNION: {.
c3b0: 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54        int unionT
c3c0: 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ab;    /* Cursor
c3d0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
c3e0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68  emporary table h
c3f0: 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
c400: 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
c410: 30 3b 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  0;      /* One o
c420: 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61  f the SRT_ opera
c430: 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74  tions to apply t
c440: 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20  o self */.      
c450: 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
c460: 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
c470: 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
c480: 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
c490: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
c4a0: 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74  pLimit, *pOffset
c4b0: 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65  ; /* Saved value
c4c0: 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61  s of p->nLimit a
c4d0: 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f  nd p->nOffset */
c4e0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
c4f0: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
c500: 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20  t uniondest;..  
c510: 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52      priorOp = SR
c520: 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69  T_Union;.      i
c530: 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70  f( dest.eDest==p
c540: 72 69 6f 72 4f 70 20 26 26 20 21 70 2d 3e 70 4c  riorOp && !p->pL
c550: 69 6d 69 74 20 26 26 20 21 70 2d 3e 70 4f 66 66  imit && !p->pOff
c560: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  set ){.        /
c570: 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65 20 61  * We can reuse a
c580: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
c590: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
c5a0: 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20  SELECT to our.  
c5b0: 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a        ** right..
c5c0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c5d0: 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65     unionTab = de
c5e0: 73 74 2e 69 50 61 72 6d 3b 0a 20 20 20 20 20 20  st.iParm;.      
c5f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
c600: 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  * We will need t
c610: 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e  o create our own
c620: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
c630: 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20   to hold the.   
c640: 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64       ** intermed
c650: 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20  iate results..  
c660: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c670: 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72   unionTab = pPar
c680: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
c690: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
c6a0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
c6b0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
c6c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c6d0: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
c6e0: 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  al, unionTab, 0)
c6f0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
c700: 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
c710: 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[0] == -1 );.  
c720: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
c730: 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
c740: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 52 69 67  .        p->pRig
c750: 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73  htmost->selFlags
c760: 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
c770: 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73  eral;.        as
c780: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
c790: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
c7a0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
c7b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
c7c0: 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20  to our left.    
c7d0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
c7e0: 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64  t( !pPrior->pOrd
c7f0: 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71  erBy );.      sq
c800: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
c810: 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20  nit(&uniondest, 
c820: 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
c830: 62 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  b);.      rc = s
c840: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
c850: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
c860: 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
c870: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
c880: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
c890: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
c8a0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
c8b0: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
c8c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
c8d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
c8e0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
c8f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
c900: 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
c910: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c920: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
c930: 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
c940: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e       op = SRT_Un
c950: 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ion;.      }.   
c960: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
c970: 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
c980: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
c990: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
c9a0: 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
c9b0: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
c9c0: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
c9d0: 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
c9e0: 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
c9f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ca00: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
ca10: 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  p, &uniondest);.
ca20: 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66        /* Query f
ca30: 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c  lattening in sql
ca40: 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67  ite3Select() mig
ca50: 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72  ht refill p->pOr
ca60: 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20  derBy..      ** 
ca70: 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74  Be sure to delet
ca80: 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74  e p->pOrderBy, t
ca90: 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f  herefore, to avo
caa0: 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  id a memory leak
cab0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
cac0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
cad0: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
cae0: 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
caf0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
cb00: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
cb10: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
cb20: 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
cb30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
cb40: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
cb50: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  imit);.      p->
cb60: 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
cb70: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
cb80: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
cb90: 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30     p->iLimit = 0
cba0: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73  ;.      p->iOffs
cbb0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  et = 0;.      if
cbc0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
cbd0: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
cbe0: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
cbf0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  .      /* Conver
cc00: 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  t the data in th
cc10: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
cc20: 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
cc30: 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74  form.      ** it
cc40: 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72   is that we curr
cc50: 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20  ently need..    
cc60: 20 20 2a 2f 20 20 20 20 20 20 0a 20 20 20 20 20    */      .     
cc70: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21   if( dest.eDest!
cc80: 3d 70 72 69 6f 72 4f 70 20 7c 7c 20 75 6e 69 6f  =priorOp || unio
cc90: 6e 54 61 62 21 3d 64 65 73 74 2e 69 50 61 72 6d  nTab!=dest.iParm
cca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
ccb0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
ccc0: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
ccd0: 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
cce0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ccf0: 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
cd00: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
cd10: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
cd20: 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
cd30: 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
cd40: 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
cd50: 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
cd60: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  r;.          gen
cd70: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
cd80: 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
cd90: 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  st->pEList);.   
cda0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
cdb0: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
cdc0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
cdd0: 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
cde0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
cdf0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
ce00: 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
ce10: 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
ce20: 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
ce30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ce40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
ce50: 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
ce60: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69  reak);.        i
ce70: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
ce80: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
ce90: 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  );.        selec
cea0: 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
ceb0: 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
cec0: 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45   unionTab, p->pE
ced0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cef0: 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64 65 73       0, -1, &des
cf00: 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
cf10: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
cf20: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
cf30: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
cf40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cf50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
cf60: 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
cf70: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
cf80: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
cf90: 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
cfa0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
cfb0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cfc0: 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
cfd0: 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
cfe0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cff0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
d000: 4e 54 45 52 53 45 43 54 3a 20 7b 0a 20 20 20 20  NTERSECT: {.    
d010: 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32    int tab1, tab2
d020: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e  ;.      int iCon
d030: 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
d040: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
d050: 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
d060: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
d070: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
d080: 74 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b  t intersectdest;
d090: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a  .      int r1;..
d0a0: 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45        /* INTERSE
d0b0: 43 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  CT is different 
d0c0: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20  from the others 
d0d0: 73 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65  since it require
d0e0: 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74  s.      ** two t
d0f0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
d100: 20 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69    Hence it has i
d110: 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65  ts own case.  Be
d120: 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  gin.      ** by 
d130: 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74  allocating the t
d140: 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65  ables we will ne
d150: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
d160: 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
d170: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
d180: 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
d190: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Tab++;.      ass
d1a0: 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
d1b0: 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64  ==0 );..      ad
d1c0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
d1d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
d1e0: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31  nEphemeral, tab1
d1f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
d200: 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
d210: 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
d220: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
d230: 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b  nEphm[0] = addr;
d240: 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74  .      p->pRight
d250: 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  most->selFlags |
d260: 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
d270: 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  al;.      assert
d280: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a  ( p->pEList );..
d290: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
d2a0: 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f 75 72  e SELECTs to our
d2b0: 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f   left into tempo
d2c0: 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 31  rary table "tab1
d2d0: 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
d2e0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d2f0: 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65  estInit(&interse
d300: 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f  ctdest, SRT_Unio
d310: 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20  n, tab1);.      
d320: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
d330: 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
d340: 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  r, &intersectdes
d350: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
d360: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
d370: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
d380: 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
d390: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
d3a0: 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
d3b0: 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
d3c0: 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a  e "tab2".      *
d3d0: 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  /.      addr = s
d3e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d3f0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
d400: 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a  eral, tab2, 0);.
d410: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
d420: 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
d430: 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
d440: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
d450: 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  1] = addr;.     
d460: 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
d470: 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
d480: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
d490: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
d4a0: 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
d4b0: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
d4c0: 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
d4d0: 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74  .      intersect
d4e0: 64 65 73 74 2e 69 50 61 72 6d 20 3d 20 74 61 62  dest.iParm = tab
d4f0: 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  2;.      rc = sq
d500: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
d510: 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73 65 63  se, p, &intersec
d520: 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 44  tdest);.      pD
d530: 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
d540: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
d550: 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
d560: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
d570: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
d580: 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  it);.      p->pL
d590: 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
d5a0: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
d5b0: 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  = pOffset;.     
d5c0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
d5d0: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
d5e0: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
d5f0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  }..      /* Gene
d600: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
d610: 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
d620: 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
d630: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
d640: 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
d650: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
d660: 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
d670: 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
d680: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
d690: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
d6a0: 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
d6b0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
d6c0: 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
d6d0: 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
d6e0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65  rior;.        ge
d6f0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
d700: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
d710: 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
d720: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65      }.      iBre
d730: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
d740: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
d750: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
d760: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d770: 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  (v);.      compu
d780: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
d790: 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
d7a0: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
d7b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d7c0: 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
d7d0: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
d7e0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
d7f0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
d800: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
d810: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d820: 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74  (v, OP_RowKey, t
d830: 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ab1, r1);.      
d840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d850: 33 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  3(v, OP_NotFound
d860: 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
d870: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
d880: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
d890: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
d8a0: 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
d8b0: 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
d8c0: 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 20 70  >pEList, tab1, p
d8d0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
d8e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d8f0: 20 20 20 20 20 20 20 30 2c 20 2d 31 2c 20 26 64         0, -1, &d
d900: 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
d910: 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
d920: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
d930: 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
d940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d950: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
d960: 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
d970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d980: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d990: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
d9a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d9b0: 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
d9c0: 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab2, 0);.      
d9d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d9e0: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
d9f0: 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ab1, 0);.      b
da00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
da10: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
da20: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
da30: 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  s used by .  ** 
da40: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
da50: 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
da60: 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
da70: 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
da80: 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
da90: 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
daa0: 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
dab0: 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
dac0: 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72  his section is r
dad0: 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d  un by the right-
dae0: 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
daf0: 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a  ement only..  **
db00: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
db10: 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  ts to the left a
db20: 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20  lways skip this 
db30: 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74  part.  The right
db40: 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43  -most.  ** SELEC
db50: 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69  T might also ski
db60: 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69  p this part if i
db70: 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42  t has no ORDER B
db80: 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a  Y clause and.  *
db90: 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73  * no temp tables
dba0: 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20   are required.. 
dbb0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
dbc0: 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45  Flags & SF_UsesE
dbd0: 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
dbe0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc00: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
dc10: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
dc20: 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
dc30: 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
dc40: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
dc50: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
dc60: 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
dc70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dc80: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
dc90: 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
dca0: 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
dcb0: 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c   CollSeq **apCol
dcc0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
dcd0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
dce0: 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e  rough pKeyInfo->
dcf0: 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69  aColl[] */.    i
dd00: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd20: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
dd30: 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20  s in result set 
dd40: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
dd50: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70  p->pRightmost==p
dd60: 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   );.    nCol = p
dd70: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
dd80: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
dd90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
dda0: 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20  ero(db,.        
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
ddc0: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29  izeof(*pKeyInfo)
ddd0: 2b 6e 43 6f 6c 2a 28 73 69 7a 65 6f 66 28 43 6f  +nCol*(sizeof(Co
dde0: 6c 6c 53 65 71 2a 29 20 2b 20 31 29 29 3b 0a 20  llSeq*) + 1));. 
ddf0: 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f     if( !pKeyInfo
de00: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
de10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
de20: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
de30: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
de40: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  .    pKeyInfo->e
de50: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
de60: 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65    pKeyInfo->nFie
de70: 6c 64 20 3d 20 6e 43 6f 6c 3b 0a 0a 20 20 20 20  ld = nCol;..    
de80: 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d  for(i=0, apColl=
de90: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b  pKeyInfo->aColl;
dea0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70   i<nCol; i++, ap
deb0: 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  Coll++){.      *
dec0: 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65  apColl = multiSe
ded0: 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
dee0: 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20  se, p, i);.     
def0: 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20   if( 0==*apColl 
df00: 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f  ){.        *apCo
df10: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
df20: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
df30: 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  }..    for(pLoop
df40: 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
df50: 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b  =pLoop->pPrior){
df60: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
df70: 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<2; i++){.     
df80: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c     int addr = pL
df90: 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
dfa0: 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  m[i];.        if
dfb0: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
dfc0: 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20        /* If [0] 
dfd0: 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b  is unused then [
dfe0: 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65  1] is also unuse
dff0: 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20  d.  So we can.  
e000: 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
e010: 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61  s safely abort a
e020: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69  s soon as the fi
e030: 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20  rst unused slot 
e040: 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  is found */.    
e050: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
e060: 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  oop->addrOpenEph
e070: 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20  m[1]<0 );.      
e080: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e090: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
e0a0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
e0b0: 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b  (v, addr, nCol);
e0c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e0d0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
e0e0: 61 64 64 72 2c 20 28 63 68 61 72 2a 29 70 4b 65  addr, (char*)pKe
e0f0: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
e100: 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  O);.        pLoo
e110: 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
e120: 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  i] = -1;.      }
e130: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
e140: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4b 65  e3DbFree(db, pKe
e150: 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c  yInfo);.  }..mul
e160: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20  ti_select_end:. 
e170: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 64   pDest->iMem = d
e180: 65 73 74 2e 69 4d 65 6d 3b 0a 20 20 70 44 65 73  est.iMem;.  pDes
e190: 74 2d 3e 6e 4d 65 6d 20 3d 20 64 65 73 74 2e 6e  t->nMem = dest.n
e1a0: 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  Mem;.  sqlite3Se
e1b0: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
e1c0: 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72  Delete);.  retur
e1d0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
e1e0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
e1f0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
e200: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
e210: 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
e220: 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e  e for a coroutin
e230: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
e240: 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   of a.** SELECT 
e250: 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  statment..**.** 
e260: 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f  The data to be o
e270: 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e  utput is contain
e280: 65 64 20 69 6e 20 70 49 6e 2d 3e 69 4d 65 6d 2e  ed in pIn->iMem.
e290: 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70    There are.** p
e2a0: 49 6e 2d 3e 6e 4d 65 6d 20 63 6f 6c 75 6d 6e 73  In->nMem columns
e2b0: 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20   to be output.  
e2c0: 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74  pDest is where t
e2d0: 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64  he output should
e2e0: 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a  .** be sent..**.
e2f0: 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20  ** regReturn is 
e300: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
e310: 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
e320: 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ng the subroutin
e330: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72  e.** return addr
e340: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  ess..**.** If re
e350: 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20  gPrev>0 then it 
e360: 69 73 20 61 20 74 68 65 20 66 69 72 73 74 20 72  is a the first r
e370: 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63  egister in a vec
e380: 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f  tor that.** reco
e390: 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  rds the previous
e3a0: 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65   output.  mem[re
e3b0: 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67  gPrev] is a flag
e3c0: 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a   that is false.*
e3d0: 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62  * if there has b
e3e0: 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20  een no previous 
e3f0: 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50  output.  If regP
e400: 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20  rev>0 then code 
e410: 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  is.** generated 
e420: 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c  to suppress dupl
e430: 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66  icates.  pKeyInf
e440: 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f  o is used for co
e450: 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e  mparing.** keys.
e460: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49  .**.** If the LI
e470: 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e  MIT found in p->
e480: 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65  iLimit is reache
e490: 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  d, jump immediat
e4a0: 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b  ely to.** iBreak
e4b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e4c0: 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
e4d0: 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73  broutine(.  Pars
e4e0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
e4f0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
e500: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
e510: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
e520: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
e530: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
e540: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e   SelectDest *pIn
e550: 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f  ,        /* Coro
e560: 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20  utine supplying 
e570: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
e580: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
e590: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65    /* Where to se
e5a0: 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20  nd the data */. 
e5b0: 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20   int regReturn, 
e5c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e5d0: 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  return address r
e5e0: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
e5f0: 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20   regPrev,       
e600: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
e610: 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
e620: 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73  .  No uniqueness
e630: 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e   if 0 */.  KeyIn
e640: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
e650: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72     /* For compar
e660: 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75  ing with previou
e670: 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  s entry */.  int
e680: 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20 20   p4type,        
e690: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 34 20 74       /* The p4 t
e6a0: 79 70 65 20 66 6f 72 20 70 4b 65 79 49 6e 66 6f  ype for pKeyInfo
e6b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e6d0: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65   Jump here if we
e6e0: 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a   hit the LIMIT *
e6f0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
e700: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
e710: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b    int iContinue;
e720: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20  .  int addr;..  
e730: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
e740: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
e750: 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  ;.  iContinue = 
e760: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
e770: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53  abel(v);..  /* S
e780: 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
e790: 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58  es for UNION, EX
e7a0: 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
e7b0: 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ECT .  */.  if( 
e7c0: 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69  regPrev ){.    i
e7d0: 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a  nt j1, j2;.    j
e7e0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
e7f0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
e800: 74 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  t, regPrev);.   
e810: 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
e820: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
e830: 6d 70 61 72 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d  mpare, pIn->iMem
e840: 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
e850: 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->nMem,.        
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e870: 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
e880: 79 49 6e 66 6f 2c 20 70 34 74 79 70 65 29 3b 0a  yInfo, p4type);.
e890: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e8a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
e8b0: 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75  , j2+2, iContinu
e8c0: 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71  e, j2+2);.    sq
e8d0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
e8e0: 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71  e(v, j1);.    sq
e8f0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
e900: 79 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  y(pParse, pIn->i
e910: 4d 65 6d 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  Mem, regPrev+1, 
e920: 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  pIn->nMem);.    
e930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e940: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
e950: 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
e960: 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
e970: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e980: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
e990: 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
e9a0: 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
e9b0: 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72   entries if ther
e9c0: 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63  e is an OFFSET c
e9d0: 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64  lause.  */.  cod
e9e0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69 43  eOffset(v, p, iC
e9f0: 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69  ontinue);..  swi
ea00: 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73  tch( pDest->eDes
ea10: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72  t ){.    /* Stor
ea20: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
ea30: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
ea40: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
ea50: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
ea60: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
ea70: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
ea80: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
ea90: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
eaa0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
eab0: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
eac0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
ead0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
eae0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
eaf0: 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
eb00: 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 2c  iMem, pIn->nMem,
eb10: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
eb20: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
eb30: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44   OP_NewRowid, pD
eb40: 65 73 74 2d 3e 69 50 61 72 6d 2c 20 72 32 29 3b  est->iParm, r2);
eb50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
eb60: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
eb70: 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 50  nsert, pDest->iP
eb80: 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
eb90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
eba0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
ebb0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
ebc0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
ebd0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
ebe0: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
ebf0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
ec00: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
ec10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ec20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ec30: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
ec40: 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
ec50: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
ec60: 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
ec70: 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
ec80: 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
ec90: 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
eca0: 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
ecb0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
ecc0: 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
ecd0: 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
ece0: 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
ecf0: 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
ed00: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
ed10: 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
ed20: 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r1;.      assert
ed30: 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d 3d 31 20 29  ( pIn->nMem==1 )
ed40: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 66 66 69 6e  ;.      p->affin
ed50: 69 74 79 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ity = .         
ed60: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
ed70: 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74  finity(p->pEList
ed80: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
ed90: 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 29 3b 0a  est->affinity);.
eda0: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
edb0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
edc0: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
edd0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
ede0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
edf0: 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 2c 20 72 31  pIn->iMem, 1, r1
ee00: 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79 2c 20  , &p->affinity, 
ee10: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
ee20: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
ee30: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
ee40: 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a   pIn->iMem, 1);.
ee50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ee60: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
ee70: 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e  xInsert, pDest->
ee80: 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  iParm, r1);.    
ee90: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
eea0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
eeb0: 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
eec0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20  ;.    }..#if 0  
eed0: 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20  /* Never occurs 
eee0: 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71  on an ORDER BY q
eef0: 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  uery */.    /* I
ef00: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
ef10: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
ef20: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
ef30: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
ef40: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
ef50: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
ef60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ef70: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
ef80: 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 50  er, 1, pDest->iP
ef90: 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  arm);.      /* T
efa0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
efb0: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
efc0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
efd0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
efe0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
eff0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
f000: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
f010: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
f020: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
f030: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
f040: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
f050: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
f060: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
f070: 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
f080: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
f090: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
f0a0: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
f0b0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e     assert( pIn->
f0c0: 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nMem==1 );.     
f0d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f0e0: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
f0f0: 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69  ->iMem, pDest->i
f100: 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
f110: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
f120: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
f130: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
f140: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
f150: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
f160: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
f170: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
f180: 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65  Y */..    /* The
f190: 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
f1a0: 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
f1b0: 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  e of registers. 
f1c0: 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
f1d0: 74 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2e 20 20  t pDest->iMem.  
f1e0: 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74  Then the co-rout
f1f0: 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20  ine yields..    
f200: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
f210: 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  Coroutine: {.   
f220: 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 4d     if( pDest->iM
f230: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  em==0 ){.       
f240: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 73   pDest->iMem = s
f250: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
f260: 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
f270: 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 70  nMem);.        p
f280: 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d 20 70 49 6e  Dest->nMem = pIn
f290: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->nMem;.      }.
f2a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
f2b0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
f2c0: 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 70 44 65  , pIn->iMem, pDe
f2d0: 73 74 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d  st->iMem, pDest-
f2e0: 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71  >nMem);.      sq
f2f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
f300: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
f310: 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20 20 20  st->iParm);.    
f320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
f330: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 61      /* Results a
f340: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
f350: 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
f360: 74 65 72 73 2e 20 20 54 68 65 6e 20 74 68 65 0a  ters.  Then the.
f370: 20 20 20 20 2a 2a 20 4f 50 5f 52 65 73 75 6c 74      ** OP_Result
f380: 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73  Row opcode is us
f390: 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69  ed to cause sqli
f3a0: 74 65 33 5f 73 74 65 70 28 29 20 74 6f 20 72 65  te3_step() to re
f3b0: 74 75 72 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  turn.    ** the 
f3c0: 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75  next row of resu
f3d0: 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  lt..    */.    c
f3e0: 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20  ase SRT_Output: 
f3f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
f400: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f410: 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e  ResultRow, pIn->
f420: 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29  iMem, pIn->nMem)
f430: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
f440: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
f450: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
f460: 49 6e 2d 3e 69 4d 65 6d 2c 20 70 49 6e 2d 3e 6e  In->iMem, pIn->n
f470: 4d 65 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Mem);.      brea
f480: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  k;.    }..#if !d
f490: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f4a0: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
f4b0: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
f4c0: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
f4d0: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
f4e0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
f4f0: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
f500: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
f510: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
f520: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
f530: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
f540: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
f550: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
f560: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
f570: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
f580: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
f590: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
f5a0: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
f5b0: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
f5c0: 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  : {.      break;
f5d0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
f5e0: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
f5f0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
f600: 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
f610: 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
f620: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
f630: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
f640: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f650: 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c 69 6d  _AddImm, p->iLim
f660: 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c  it, -1);.    sql
f670: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f680: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e  , OP_IfZero, p->
f690: 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
f6a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
f6b0: 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69  ate the subrouti
f6c0: 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  ne return.  */. 
f6d0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
f6e0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
f6f0: 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
f700: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
f710: 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74  P_Return, regRet
f720: 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  urn);..  return 
f730: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
f740: 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f  lternative compo
f750: 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20  und select code 
f760: 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61  generator for ca
f770: 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a  ses when there.*
f780: 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  * is an ORDER BY
f790: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57   clause..**.** W
f7a0: 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79  e assume a query
f7b0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
f7c0: 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  g form:.**.**   
f7d0: 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f     <selectA>  <o
f7e0: 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63  perator>  <selec
f7f0: 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f  tB>  ORDER BY <o
f800: 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a  rderbylist>.**.*
f810: 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
f820: 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c  one of UNION ALL
f830: 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  , UNION, EXCEPT,
f840: 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20   or INTERSECT.  
f850: 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74  The idea.** is t
f860: 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c  o code both <sel
f870: 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63  ectA> and <selec
f880: 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44  tB> with the ORD
f890: 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a  ER BY clause as.
f8a0: 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20  ** co-routines. 
f8b0: 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f   Then run the co
f8c0: 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72  -routines in par
f8d0: 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20  allel and merge 
f8e0: 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
f8f0: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20  nto the output. 
f900: 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
f910: 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
f920: 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63  es (called selec
f930: 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  tA and.** select
f940: 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73  B) there are 7 s
f950: 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a  ubroutines:.**.*
f960: 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f  *    outA:    Mo
f970: 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
f980: 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72   the selectA cor
f990: 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
f9a0: 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
f9b0: 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
f9c0: 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a  pound query..**.
f9d0: 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d  **    outB:    M
f9e0: 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
f9f0: 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f  f the selectB co
fa00: 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
fa10: 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
fa20: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
fa30: 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28  mpound query.  (
fa40: 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66  Only generated f
fa50: 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20  or UNION and.** 
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
fa70: 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61  N ALL.  EXCEPT a
fa80: 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65  nd INSERTSECT ne
fa90: 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77  ver output a row
faa0: 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
fab0: 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c       appears onl
fac0: 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20  y in B.).**.**  
fad0: 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65    AltB:    Calle
fae0: 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
faf0: 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
fb00: 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c  oroutines and A<
fb10: 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42  B..**.**    AeqB
fb20: 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
fb30: 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
fb40: 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
fb50: 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a  nes and A==B..**
fb60: 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20  .**    AgtB:    
fb70: 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
fb80: 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
fb90: 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
fba0: 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A>B..**.**   
fbb0: 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64   EofA:    Called
fbc0: 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
fbd0: 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
fbe0: 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45  ectA..**.**    E
fbf0: 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofB:    Called w
fc00: 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
fc10: 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
fc20: 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  tB..**.** The im
fc30: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
fc40: 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20  the latter five 
fc50: 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65  subroutines depe
fc60: 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20  nd on which .** 
fc70: 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73  <operator> is us
fc80: 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed:.**.**.**    
fc90: 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
fca0: 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e  LL         UNION
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45              EXCE
fcc0: 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45  PT          INTE
fcd0: 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  RSECT.**        
fce0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20    ------------- 
fcf0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
fd00: 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
fd10: 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
fd20: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a  -----.**   AltB:
fd30: 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
fd40: 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
fd50: 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
fd60: 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a  A         nextA.
fd70: 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20  **.**   AeqB:   
fd80: 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
fd90: 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
fda0: 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
fdb0: 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a      outA, nextA.
fdc0: 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20  **.**   AgtB:   
fdd0: 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
fde0: 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
fdf0: 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20        nextB     
fe00: 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a         nextB.**.
fe10: 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74  **   EofA:   out
fe20: 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
fe30: 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
fe40: 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20     halt         
fe50: 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20      halt.**.**  
fe60: 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e   EofB:   outA, n
fe70: 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
fe80: 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
fe90: 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
fea0: 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  halt.**.** In th
feb0: 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e  e AltB, AeqB, an
fec0: 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e  d AgtB subroutin
fed0: 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20  es, an EOF on A 
fee0: 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a  following nextA.
fef0: 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d  ** causes an imm
ff00: 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
ff10: 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f  ofA and an EOF o
ff20: 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n B following ne
ff30: 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e  xtB causes.** an
ff40: 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
ff50: 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e  to EofB.  Within
ff60: 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20   EofA and EofB, 
ff70: 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79  and EOF on entry
ff80: 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   or.** following
ff90: 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20   nextX causes a 
ffa0: 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  jump to the end 
ffb0: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72  of the select pr
ffc0: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
ffd0: 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  Duplicate remova
ffe0: 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20  l in the UNION, 
fff0: 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
10000 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68  RSECT cases is h
10010 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e  andled.** within
10020 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
10030 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67  outine.  The reg
10040 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65  Prev register se
10050 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76  t holds the prev
10060 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74  iously.** output
10070 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61   value.  A compa
10080 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67  rison is made ag
10090 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65  ainst this value
100a0 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
100b0 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ** is skipped if
100c0 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74   the next result
100d0 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73  s would be the s
100e0 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69  ame as the previ
100f0 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ous..**.** The i
10100 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c  mplementation pl
10110 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65  an is to impleme
10120 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  nt the two corou
10130 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a  tines and seven.
10140 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66  ** subroutines f
10150 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74  irst, then put t
10160 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63  he control logic
10170 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20   at the bottom. 
10180 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
10190 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  *          goto 
101a0 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a  Init.**     coA:
101b0 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
101c0 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a  eft query (A).**
101d0 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74       coB: corout
101e0 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75  ine for right qu
101f0 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75  ery (B).**    ou
10200 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tA: output one r
10210 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75  ow of A.**    ou
10220 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tB: output one r
10230 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61  ow of B (UNION a
10240 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c  nd UNION ALL onl
10250 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e  y).**    EofA: .
10260 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e  ...**    EofB: .
10270 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e  ...**    AltB: .
10280 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e  ...**    AeqB: .
10290 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e  ...**    AgtB: .
102a0 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69  ...**    Init: i
102b0 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74  nitialize corout
102c0 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  ine registers.**
102d0 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
102e0 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coA.**          
102f0 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45  if eof(A) goto E
10300 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ofA.**          
10310 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20  yield coB.**    
10320 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20        if eof(B) 
10330 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20  goto EofB.**    
10340 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c  Cmpr: Compare A,
10350 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a   B.**          J
10360 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  ump AltB, AeqB, 
10370 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a  AgtB.**     End:
10380 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61   ....**.** We ca
10390 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  ll AltB, AeqB, A
103a0 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45  gtB, EofA, and E
103b0 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73  ofB "subroutines
103c0 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e  " but they are n
103d0 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63  ot.** actually c
103e0 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75  alled using Gosu
103f0 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f  b and they do no
10400 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20  t Return.  EofA 
10410 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a  and EofB loop.**
10420 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20   until all data 
10430 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65  is exhausted the
10440 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65  n jump to the "e
10450 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c  nd" labe.  AltB,
10460 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67   AeqB,.** and Ag
10470 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65  tB jump to eithe
10480 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f  r L2 or to one o
10490 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a  f EofA or EofB..
104a0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
104b0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
104c0 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e  SELECT.static in
104d0 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
104e0 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
104f0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
10500 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
10510 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
10520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10530 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
10540 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
10550 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
10560 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
10570 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
10580 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
10590 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
105a0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
105b0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
105c0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
105d0 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
105e0 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
105f0 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
10600 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
10610 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
10620 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
10630 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
10640 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
10650 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stA;     /* Dest
10660 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
10670 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c  utine A */.  Sel
10680 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20  ectDest destB;  
10690 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
106a0 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
106b0 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  B */.  int regAd
106c0 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drA;         /* 
106d0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
106e0 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f   for select-A co
106f0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10700 20 72 65 67 45 6f 66 41 3b 20 20 20 20 20 20 20   regEofA;       
10710 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e     /* Flag to in
10720 64 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65  dicate when sele
10730 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65 74 65  ct-A is complete
10740 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
10750 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rB;         /* A
10760 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
10770 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  for select-B cor
10780 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10790 72 65 67 45 6f 66 42 3b 20 20 20 20 20 20 20 20  regEofB;        
107a0 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64    /* Flag to ind
107b0 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63  icate when selec
107c0 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74 65 20  t-B is complete 
107d0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
107e0 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectA;      /* Ad
107f0 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
10800 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
10810 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c  */.  int addrSel
10820 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64  ectB;      /* Ad
10830 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
10840 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20  ect-B coroutine 
10850 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41  */.  int regOutA
10860 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
10870 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
10880 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  or the output-A 
10890 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
108a0 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20  int regOutB;    
108b0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
108c0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
108d0 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
108e0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
108f0 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20  ddrOutA;        
10900 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
10910 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72  he output-A subr
10920 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10930 61 64 64 72 4f 75 74 42 3b 20 20 20 20 20 20 20  addrOutB;       
10940 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10950 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
10960 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10970 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20   addrEofA;      
10980 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
10990 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78   the select-A-ex
109a0 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
109b0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
109c0 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofB;         /*
109d0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
109e0 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74  select-B-exhaust
109f0 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
10a00 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b  .  int addrAltB;
10a10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10a20 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73  ess of the A<B s
10a30 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
10a40 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20  nt addrAeqB;    
10a50 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
10a60 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72  of the A==B subr
10a70 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10a80 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20  addrAgtB;       
10a90 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
10aa0 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69  the A>B subrouti
10ab0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ne */.  int regL
10ac0 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a  imitA;        /*
10ad0 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
10ae0 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
10af0 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b    int regLimitB;
10b00 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
10b10 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
10b20 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
10b30 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
10b40 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20    /* A range of 
10b50 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
10b60 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  d previous outpu
10b70 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
10b80 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
10b90 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
10ba0 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e  ->iLimit */.  in
10bb0 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20  t savedOffset;  
10bc0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
10bd0 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74  ue of p->iOffset
10be0 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43   */.  int labelC
10bf0 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  mpr;        /* L
10c00 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61  abel for the sta
10c10 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20  rt of the merge 
10c20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69  algorithm */.  i
10c30 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20  nt labelEnd;    
10c40 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
10c50 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
10c60 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20   overall SELECT 
10c70 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31  stmt */.  int j1
10c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10c90 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74  /* Jump instruct
10ca0 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65  ions that get re
10cb0 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69  targetted */.  i
10cc0 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
10cd0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
10ce0 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c  K_ALL, TK_UNION,
10cf0 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49   TK_EXCEPT, TK_I
10d00 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65  NTERSECT */.  Ke
10d10 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d  yInfo *pKeyDup =
10d20 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f   0; /* Compariso
10d30 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
10d40 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  r duplicate remo
10d50 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  val */.  KeyInfo
10d60 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f   *pKeyMerge;   /
10d70 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
10d80 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72  ormation for mer
10d90 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73  ging rows */.  s
10da0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
10db0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
10dc0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
10dd0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
10de0 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
10df0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
10e00 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
10e10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10e20 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
10e30 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
10e40 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  se */.  int *aPe
10e50 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  rmute;        /*
10e60 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52   Mapping from OR
10e70 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
10e80 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
10e90 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ns */..  assert(
10ea0 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20   p->pOrderBy!=0 
10eb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
10ec0 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d  yDup==0 ); /* "M
10ed0 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65  anaged" code nee
10ee0 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74  ds this.  Ticket
10ef0 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20   #3382. */.  db 
10f00 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10f10 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
10f20 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  e;.  if( v==0 ) 
10f30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10f40 4d 45 4d 3b 0a 20 20 6c 61 62 65 6c 45 6e 64 20  MEM;.  labelEnd 
10f50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
10f60 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62  eLabel(v);.  lab
10f70 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65 33  elCmpr = sqlite3
10f80 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
10f90 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20 75  ;...  /* Patch u
10fa0 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  p the ORDER BY c
10fb0 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20  lause.  */.  op 
10fc0 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72  = p->op;  .  pPr
10fd0 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
10fe0 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f  .  assert( pPrio
10ff0 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  r->pOrderBy==0 )
11000 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
11010 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61 73  ->pOrderBy;.  as
11020 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 29  sert( pOrderBy )
11030 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ;.  nOrderBy = p
11040 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
11050 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74  .  /* For operat
11060 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 55  ors other than U
11070 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76 65  NION ALL we have
11080 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
11090 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  at.  ** the ORDE
110a0 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76 65  R BY clause cove
110b0 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66  rs every term of
110c0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
110d0 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73    Add.  ** terms
110e0 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
110f0 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65 73   clause as neces
11100 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
11110 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op!=TK_ALL ){. 
11120 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e     for(i=1; db->
11130 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
11140 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  && i<=p->pEList-
11150 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
11160 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
11170 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
11180 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
11190 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
111a0 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a  a; j<nOrderBy; j
111b0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
111c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
111d0 74 65 6d 2d 3e 69 43 6f 6c 3e 30 20 29 3b 0a 20  tem->iCol>0 );. 
111e0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
111f0 2d 3e 69 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61  ->iCol==i ) brea
11200 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
11210 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79   if( j==nOrderBy
11220 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
11230 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
11240 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
11250 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20  _INTEGER, 0, 0, 
11260 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
11270 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
11280 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11290 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61         pNew->fla
112a0 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75  gs |= EP_IntValu
112b0 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e;.        pNew-
112c0 3e 69 54 61 62 6c 65 20 3d 20 69 3b 0a 20 20 20  >iTable = i;.   
112d0 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
112e0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
112f0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f  ppend(pParse, pO
11300 72 64 65 72 42 79 2c 20 70 4e 65 77 2c 20 30 29  rderBy, pNew, 0)
11310 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
11320 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b  By->a[nOrderBy++
11330 5d 2e 69 43 6f 6c 20 3d 20 69 3b 0a 20 20 20 20  ].iCol = i;.    
11340 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
11350 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
11360 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75  comparison permu
11370 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e  tation and keyin
11380 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20  fo that is used 
11390 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65  with.  ** the pe
113a0 72 6d 75 74 61 74 69 6f 6e 20 69 6e 20 6f 72 64  rmutation in ord
113b0 65 72 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  er to comparison
113c0 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  s to determine i
113d0 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20  f the next.  ** 
113e0 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63  row of results c
113f0 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  omes from select
11400 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41  A or selectB.  A
11410 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74  lso add explicit
11420 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73  .  ** collations
11430 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
11440 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f   clause terms so
11450 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73   that when the s
11460 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74  ubqueries.  ** t
11470 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20  o the right and 
11480 74 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61  the left are eva
11490 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65  luated, they use
114a0 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a   the correct.  *
114b0 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a  * collation..  *
114c0 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73  /.  aPermute = s
114d0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
114e0 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  w(db, sizeof(int
114f0 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69  )*nOrderBy);.  i
11500 66 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20  f( aPermute ){. 
11510 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
11520 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
11530 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
11540 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
11550 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c  i<nOrderBy; i++,
11560 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
11570 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
11580 69 43 6f 6c 3e 30 20 20 26 26 20 70 49 74 65 6d  iCol>0  && pItem
11590 2d 3e 69 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73  ->iCol<=p->pELis
115a0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
115b0 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20    aPermute[i] = 
115c0 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 2d 20 31 3b  pItem->iCol - 1;
115d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
115e0 65 72 67 65 20 3d 0a 20 20 20 20 20 20 73 71 6c  erge =.      sql
115f0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
11600 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79  db, sizeof(*pKey
11610 4d 65 72 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a  Merge)+nOrderBy*
11620 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
11630 29 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70  )+1));.    if( p
11640 4b 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  KeyMerge ){.    
11650 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f    pKeyMerge->aSo
11660 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
11670 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c  pKeyMerge->aColl
11680 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20  [nOrderBy];.    
11690 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69    pKeyMerge->nFi
116a0 65 6c 64 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  eld = nOrderBy;.
116b0 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
116c0 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  >enc = ENC(db);.
116d0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
116e0 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
116f0 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
11700 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
11710 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
11720 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
11730 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
11740 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20   pTerm->flags & 
11750 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b  EP_ExpCollate ){
11760 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
11770 20 3d 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 3b   = pTerm->pColl;
11780 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
11790 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
117a0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
117b0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
117c0 61 50 65 72 6d 75 74 65 5b 69 5d 29 3b 0a 20 20  aPermute[i]);.  
117d0 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66          pTerm->f
117e0 6c 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f  lags |= EP_ExpCo
117f0 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 20  llate;.         
11800 20 70 54 65 72 6d 2d 3e 70 43 6f 6c 6c 20 3d 20   pTerm->pColl = 
11810 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  pColl;.        }
11820 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72  .        pKeyMer
11830 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  ge->aColl[i] = p
11840 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b  Coll;.        pK
11850 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72  eyMerge->aSortOr
11860 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42  der[i] = pOrderB
11870 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
11880 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
11890 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
118a0 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d  eyMerge = 0;.  }
118b0 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20  ..  /* Reattach 
118c0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
118d0 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79  use to the query
118e0 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ..  */.  p->pOrd
118f0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
11900 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  .  pPrior->pOrde
11910 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
11920 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d  rListDup(pParse-
11930 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  >db, pOrderBy);.
11940 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
11950 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f 72   range of tempor
11960 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61 6e  ary registers an
11970 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e 65  d the KeyInfo ne
11980 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  eded.  ** for th
11990 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65 6d  e logic that rem
119a0 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20 72  oves duplicate r
119b0 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e 20  esult rows when 
119c0 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f  the.  ** operato
119d0 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43 45  r is UNION, EXCE
119e0 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
119f0 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e 20   (but not UNION 
11a00 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ALL)..  */.  if(
11a10 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
11a20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b 0a     regPrev = 0;.
11a30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
11a40 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69   nExpr = p->pELi
11a50 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
11a60 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79 3e  ssert( nOrderBy>
11a70 3d 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 72 65  =nExpr );.    re
11a80 67 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33 47  gPrev = sqlite3G
11a90 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
11aa0 73 65 2c 20 6e 45 78 70 72 2b 31 29 3b 0a 20 20  se, nExpr+1);.  
11ab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11ac0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
11ad0 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 0, regPrev);.
11ae0 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71      pKeyDup = sq
11af0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
11b00 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  o(db,.          
11b10 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
11b20 70 4b 65 79 44 75 70 29 20 2b 20 6e 45 78 70 72  pKeyDup) + nExpr
11b30 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
11b40 2a 29 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28  *)+1) );.    if(
11b50 20 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20   pKeyDup ){.    
11b60 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
11b70 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b  Order = (u8*)&pK
11b80 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78  eyDup->aColl[nEx
11b90 70 72 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 44  pr];.      pKeyD
11ba0 75 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78  up->nField = nEx
11bb0 70 72 3b 0a 20 20 20 20 20 20 70 4b 65 79 44 75  pr;.      pKeyDu
11bc0 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  p->enc = ENC(db)
11bd0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
11be0 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a   i<nExpr; i++){.
11bf0 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
11c00 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74  >aColl[i] = mult
11c10 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
11c20 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20  Parse, p, i);.  
11c30 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61        pKeyDup->a
11c40 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30  SortOrder[i] = 0
11c50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11c60 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72    }. .  /* Separ
11c70 61 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64  ate the left and
11c80 20 74 68 65 20 72 69 67 68 74 20 71 75 65 72 79   the right query
11c90 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65   from one anothe
11ca0 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69  r.  */.  p->pPri
11cb0 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72  or = 0;.  pPrior
11cc0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30  ->pRightmost = 0
11cd0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
11ce0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
11cf0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
11d00 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
11d10 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
11d20 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
11d30 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
11d40 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
11d50 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
11d60 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
11d70 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
11d80 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
11d90 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
11da0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
11db0 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
11dc0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
11dd0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
11de0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
11df0 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
11e00 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
11e10 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
11e20 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
11e30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11e40 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
11e50 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
11e60 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
11e70 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e90 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
11ea0 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
11eb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11ec0 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
11ed0 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
11ee0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
11ef0 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
11f00 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
11f10 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
11f20 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
11f30 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
11f40 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
11f50 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  ete(db, p->pOffs
11f60 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  et);.  p->pOffse
11f70 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64  t = 0;..  regAdd
11f80 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rA = ++pParse->n
11f90 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d  Mem;.  regEofA =
11fa0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
11fb0 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b  .  regAddrB = ++
11fc0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
11fd0 72 65 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72  regEofB = ++pPar
11fe0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
11ff0 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utA = ++pParse->
12000 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20  nMem;.  regOutB 
12010 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
12020 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
12030 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41  tDestInit(&destA
12040 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
12050 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
12060 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
12070 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f  nit(&destB, SRT_
12080 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
12090 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  drB);..  /* Jump
120a0 20 70 61 73 74 20 74 68 65 20 76 61 72 69 6f 75   past the variou
120b0 73 20 73 75 62 72 6f 75 74 69 6e 65 73 20 61 6e  s subroutines an
120c0 64 20 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20  d coroutines to 
120d0 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65  the main.  ** me
120e0 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
120f0 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
12100 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
12110 6f 29 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74  o);.  addrSelect
12120 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  A = sqlite3VdbeC
12130 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
12140 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
12150 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
12160 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
12170 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  T statement to t
12180 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20  he.  ** left of 
12190 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  the compound ope
121a0 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20  rator - the "A" 
121b0 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
121c0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
121d0 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74  v, "Begin corout
121e0 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c  ine for left SEL
121f0 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72  ECT"));.  pPrior
12200 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
12210 6d 69 74 41 3b 0a 20 20 73 71 6c 69 74 65 33 53  mitA;.  sqlite3S
12220 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
12230 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20  rior, &destA);. 
12240 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12250 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
12260 2c 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20  , 1, regEofA);. 
12270 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12280 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
12290 72 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64 62  regAddrA);.  Vdb
122a0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
122b0 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20   "End coroutine 
122c0 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22  for left SELECT"
122d0 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ));..  /* Genera
122e0 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
122f0 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
12300 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
12310 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67  on .  ** the rig
12320 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c  ht - the "B" sel
12330 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ect.  */.  addrS
12340 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33  electB = sqlite3
12350 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
12360 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f  v);.  VdbeNoopCo
12370 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
12380 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72   coroutine for r
12390 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  ight SELECT"));.
123a0 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70    savedLimit = p
123b0 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65  ->iLimit;.  save
123c0 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  dOffset = p->iOf
123d0 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  fset;.  p->iLimi
123e0 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20  t = regLimitB;. 
123f0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
12400 20 20 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65    .  sqlite3Sele
12410 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
12420 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d  estB);.  p->iLim
12430 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b  it = savedLimit;
12440 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
12450 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73  savedOffset;.  s
12460 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12470 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
12480 31 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73  1, regEofB);.  s
12490 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
124a0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
124b0 67 41 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e  gAddrB);.  VdbeN
124c0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
124d0 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  End coroutine fo
124e0 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29  r right SELECT")
124f0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
12500 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
12510 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
12520 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
12530 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he A.  ** select
12540 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
12550 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
12560 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
12570 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
12580 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
12590 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41  ut routine for A
125a0 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20  "));.  addrOutA 
125b0 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
125c0 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
125d0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
125e0 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70      p, &destA, p
125f0 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20  Dest, regOutA,. 
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12610 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
12620 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
12630 44 4f 46 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  DOFF, labelEnd);
12640 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  .  .  /* Generat
12650 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
12660 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
12670 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
12680 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he B.  ** select
12690 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
126a0 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
126b0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
126c0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
126d0 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
126e0 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62  UNION ){.    Vdb
126f0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
12700 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
12710 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61   for B"));.    a
12720 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61  ddrOutB = genera
12730 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
12740 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
12750 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
12760 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65  destB, pDest, re
12770 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20  gOutB,.         
12780 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
12790 20 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59   pKeyDup, P4_KEY
127a0 49 4e 46 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62  INFO_STATIC, lab
127b0 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f  elEnd);.  }..  /
127c0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
127d0 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
127e0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
127f0 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20  from select A.  
12800 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
12810 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
12820 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69  n select B remai
12830 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ns..  */.  VdbeN
12840 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
12850 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  eof-A subroutine
12860 22 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  "));.  if( op==T
12870 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
12880 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
12890 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73      addrEofA = s
128a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
128b0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
128c0 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c  labelEnd);.  }el
128d0 73 65 7b 20 20 0a 20 20 20 20 61 64 64 72 45 6f  se{  .    addrEo
128e0 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
128f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
12900 20 72 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45   regEofB, labelE
12910 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nd);.    sqlite3
12920 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12930 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
12940 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20   addrOutB);.    
12950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12960 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
12970 65 67 41 64 64 72 42 29 3b 0a 20 20 20 20 73 71  egAddrB);.    sq
12980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12990 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
129a0 64 64 72 45 6f 66 41 29 3b 0a 20 20 7d 0a 0a 20  ddrEofA);.  }.. 
129b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
129c0 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
129d0 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
129e0 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a  s from select B.
129f0 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
12a00 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
12a10 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d   in select A rem
12a20 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
12a30 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
12a40 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
12a50 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20  B = addrEofA;.  
12a60 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62  }else{  .    Vdb
12a70 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
12a80 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69   "eof-B subrouti
12a90 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45  ne"));.    addrE
12aa0 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofB = sqlite3Vdb
12ab0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
12ac0 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c  , regEofA, label
12ad0 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  End);.    sqlite
12ae0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12af0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
12b00 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
12b10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12b20 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
12b30 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73  regAddrA);.    s
12b40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12b50 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
12b60 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
12b70 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
12b80 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
12b90 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
12ba0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
12bb0 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
12bc0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
12bd0 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
12be0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12bf0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
12c00 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
12c10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12c20 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
12c30 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
12c40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12c50 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
12c60 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73  , addrEofA);.  s
12c70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12c80 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
12c90 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
12ca0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12cb0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
12cc0 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
12cd0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
12ce0 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
12cf0 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
12d00 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
12d10 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
12d20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
12d30 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
12d40 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
12d50 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
12d60 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
12d70 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
12d80 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
12d90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12da0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
12db0 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73  regAddrA);.    s
12dc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12dd0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
12de0 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  fA, addrEofA);. 
12df0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12e00 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
12e10 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
12e20 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
12e30 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
12e40 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e  e the case of A>
12e50 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
12e60 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
12e70 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  gt-B subroutine"
12e80 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d  ));.  addrAgtB =
12e90 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
12ea0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
12eb0 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
12ec0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
12ed0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12ee0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
12ef0 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
12f00 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  OutB);.  }.  sql
12f10 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12f20 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
12f30 64 64 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrB);.  sqlite3
12f40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12f50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64  _If, regEofB, ad
12f60 64 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74  drEofB);.  sqlit
12f70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12f80 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
12f90 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  lCmpr);..  /* Th
12fa0 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63  is code runs onc
12fb0 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
12fc0 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  everything..  */
12fd0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
12fe0 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
12ff0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13000 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
13010 2c 20 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20  , 0, regEofA);. 
13020 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13030 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
13040 2c 20 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20  , 0, regEofB);. 
13050 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13060 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
13070 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 53 65  regAddrA, addrSe
13080 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  lectA);.  sqlite
13090 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
130a0 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72  P_Gosub, regAddr
130b0 42 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b  B, addrSelectB);
130c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
130d0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
130e0 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41  egEofA, addrEofA
130f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13100 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
13110 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f   regEofB, addrEo
13120 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65  fB);..  /* Imple
13130 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65  ment the main me
13140 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
13150 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
13160 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
13170 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cmpr);.  sqlite3
13180 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13190 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c  _Permutation, 0,
131a0 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50   0, 0, (char*)aP
131b0 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52  ermute, P4_INTAR
131c0 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  RAY);.  sqlite3V
131d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
131e0 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69  Compare, destA.i
131f0 4d 65 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c  Mem, destB.iMem,
13200 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13220 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
13230 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
13240 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c  _HANDOFF);.  sql
13250 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
13260 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41  , OP_Jump, addrA
13270 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61  ltB, addrAeqB, a
13280 64 64 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a 20  ddrAgtB);..  /* 
13290 52 65 6c 65 61 73 65 20 74 65 6d 70 6f 72 61 72  Release temporar
132a0 79 20 72 65 67 69 73 74 65 72 73 0a 20 20 2a 2f  y registers.  */
132b0 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29  .  if( regPrev )
132c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  {.    sqlite3Rel
132d0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
132e0 61 72 73 65 2c 20 72 65 67 50 72 65 76 2c 20 6e  arse, regPrev, n
132f0 4f 72 64 65 72 42 79 2b 31 29 3b 0a 20 20 7d 0a  OrderBy+1);.  }.
13300 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
13310 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  e this point in 
13320 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61  order to termina
13330 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  te the query..  
13340 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
13350 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
13360 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a  labelEnd);..  /*
13370 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
13380 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  of output column
13390 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  s.  */.  if( pDe
133a0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
133b0 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c  utput ){.    Sel
133c0 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50  ect *pFirst = pP
133d0 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  rior;.    while(
133e0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
133f0 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
13400 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67  t->pPrior;.    g
13410 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
13420 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
13430 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
13440 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d   }..  /* Reassem
13450 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  bly the compound
13460 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69   query so that i
13470 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
13480 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62  correctly.  ** b
13490 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
134a0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20  nction */.  if( 
134b0 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
134c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
134d0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69  lete(db, p->pPri
134e0 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50  or);.  }.  p->pP
134f0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a  rior = pPrior;..
13500 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73    /*** TBD:  Ins
13510 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ert subroutine c
13520 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75  alls to close cu
13530 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c  rsors on incompl
13540 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75  ete.  **** subqu
13550 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 72 65  eries ****/.  re
13560 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13570 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
13580 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
13590 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
135a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
135b0 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f  OMIT_VIEW)./* Fo
135c0 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f  rward Declaratio
135d0 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns */.static voi
135e0 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
135f0 73 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69  sqlite3*, ExprLi
13600 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  st*, int, ExprLi
13610 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
13620 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71  d substSelect(sq
13630 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a  lite3*, Select *
13640 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20  , int, ExprList 
13650 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  *);../*.** Scan 
13660 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
13670 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
13680 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
13690 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
136a0 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
136b0 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
136c0 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
136d0 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
136e0 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
136f0 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
13700 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
13710 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
13720 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
13730 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
13740 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
13750 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
13760 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
13770 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
13780 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
13790 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
137a0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
137b0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
137c0 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
137d0 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
137e0 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
137f0 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
13800 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
13810 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
13820 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65  ne make the nece
13830 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65  ssary .** change
13840 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68  s to pExpr so th
13850 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72  at it refers dir
13860 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75  ectly to the sou
13870 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20  rce table.** of 
13880 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74  the subquery rat
13890 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  her the result s
138a0 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  et of the subque
138b0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
138c0 69 64 20 73 75 62 73 74 45 78 70 72 28 0a 20 20  id substExpr(.  
138d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
138e0 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61      /* Report ma
138f0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74  lloc errors to t
13900 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  his connection *
13910 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
13920 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20          /* Expr 
13930 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74  in which substit
13940 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a  ution occurs */.
13950 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
13960 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
13970 6f 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64  o be substituted
13980 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
13990 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62  pEList    /* Sub
139a0 73 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69  stitute expressi
139b0 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ons */.){.  if( 
139c0 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
139d0 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
139e0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
139f0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
13a00 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66  iTable ){.    if
13a10 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
13a20 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  <0 ){.      pExp
13a30 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
13a40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13a50 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
13a60 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
13a70 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  st!=0 && pExpr->
13a80 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e  iColumn<pEList->
13a90 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
13aa0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
13ab0 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
13ac0 3e 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45  >pRight==0 && pE
13ad0 78 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b  xpr->pList==0 );
13ae0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45  .      pNew = pE
13af0 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69  List->a[pExpr->i
13b00 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20  Column].pExpr;. 
13b10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
13b20 77 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  w!=0 );.      pE
13b30 78 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e  xpr->op = pNew->
13b40 6f 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  op;.      assert
13b50 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
13b60 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
13b70 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
13b80 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65  3ExprDup(db, pNe
13b90 77 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  w->pLeft);.     
13ba0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
13bb0 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
13bc0 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
13bd0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
13be0 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69 67  p(db, pNew->pRig
13bf0 68 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ht);.      asser
13c00 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d  t( pExpr->pList=
13c10 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
13c20 72 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  r->pList = sqlit
13c30 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
13c40 2c 20 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a  , pNew->pList);.
13c50 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
13c60 62 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62  ble = pNew->iTab
13c70 6c 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  le;.      pExpr-
13c80 3e 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54  >pTab = pNew->pT
13c90 61 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  ab;.      pExpr-
13ca0 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d  >iColumn = pNew-
13cb0 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
13cc0 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e  pExpr->iAgg = pN
13cd0 65 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20  ew->iAgg;.      
13ce0 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
13cf0 28 64 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b  (db, &pExpr->tok
13d00 65 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e  en, &pNew->token
13d10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13d20 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70  TokenCopy(db, &p
13d30 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65  Expr->span, &pNe
13d40 77 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  w->span);.      
13d50 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d  pExpr->pSelect =
13d60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
13d70 70 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 65 6c  p(db, pNew->pSel
13d80 65 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ect);.      pExp
13d90 72 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d  r->flags = pNew-
13da0 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
13db0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74  }else{.    subst
13dc0 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
13dd0 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70  pLeft, iTable, p
13de0 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
13df0 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
13e00 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
13e10 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75   pEList);.    su
13e20 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45  bstSelect(db, pE
13e30 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54  xpr->pSelect, iT
13e40 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
13e50 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
13e60 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  (db, pExpr->pLis
13e70 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
13e80 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  t);.  }.}.static
13e90 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
13ea0 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist(.  sqlite3 *
13eb0 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
13ec0 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
13ed0 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78  ors here */.  Ex
13ee0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
13ef0 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63     /* List to sc
13f00 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20  an and in which 
13f10 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
13f20 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  tes */.  int iTa
13f30 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
13f40 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
13f50 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
13f60 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
13f70 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
13f80 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
13f90 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
13fa0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
13fb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
13fc0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
13fd0 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64  .    substExpr(d
13fe0 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  b, pList->a[i].p
13ff0 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
14000 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
14010 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
14020 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  lect(.  sqlite3 
14030 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
14040 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
14050 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  rors here */.  S
14060 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
14070 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
14080 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68  atement in which
14090 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
140a0 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  utions */.  int 
140b0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
140c0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
140d0 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78  replaced */.  Ex
140e0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
140f0 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
14100 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
14110 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
14120 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
14130 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
14140 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29  nt i;.  if( !p )
14150 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74   return;.  subst
14160 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
14170 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20  pEList, iTable, 
14180 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
14190 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
141a0 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65  pGroupBy, iTable
141b0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
141c0 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
141d0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62  ->pOrderBy, iTab
141e0 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
141f0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
14200 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c  pHaving, iTable,
14210 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
14220 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68  tExpr(db, p->pWh
14230 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ere, iTable, pEL
14240 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c  ist);.  substSel
14250 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ect(db, p->pPrio
14260 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  r, iTable, pELis
14270 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e  t);.  pSrc = p->
14280 70 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63  pSrc;.  if( pSrc
14290 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53   ){.    for(i=pS
142a0 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d  rc->nSrc, pItem=
142b0 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  pSrc->a; i>0; i-
142c0 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
142d0 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64     substSelect(d
142e0 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
142f0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
14300 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
14310 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
14320 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
14330 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
14340 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14350 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21  _VIEW) */..#if !
14360 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14370 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
14380 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14390 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
143a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
143b0 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
143c0 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  en subqueries in
143d0 20 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a   order to speed.
143e0 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49  ** execution.  I
143f0 74 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  t returns 1 if i
14400 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
14410 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
14420 74 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73  tening.** occurs
14430 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72  ..**.** To under
14440 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70  stand the concep
14450 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c  t of flattening,
14460 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   consider the fo
14470 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79  llowing.** query
14480 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
14490 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT a FROM (SELEC
144a0 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
144b0 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20  t1 WHERE z<100) 
144c0 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20  WHERE a>5.**.** 
144d0 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20  The default way 
144e0 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  of implementing 
144f0 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f  this query is to
14500 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20   execute the.** 
14510 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61  subquery first a
14520 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
14530 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72  ults in a tempor
14540 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a  ary table, then.
14550 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72  ** run the outer
14560 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74   query on that t
14570 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
14580 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74   This requires t
14590 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65  wo.** passes ove
145a0 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72  r the data.  Fur
145b0 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73  thermore, becaus
145c0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
145d0 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20  table.** has no 
145e0 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45  indices, the WHE
145f0 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  RE clause on the
14600 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
14610 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69  not be.** optimi
14620 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  zed..**.** This 
14630 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
14640 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72   to rewrite quer
14650 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20  ies such as the 
14660 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20  above into.** a 
14670 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65  single flat sele
14680 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ct, like this:.*
14690 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
146a0 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
146b0 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44   WHERE z<100 AND
146c0 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   a>5.**.** The c
146d0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f  ode generated fo
146e0 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61  r this simpifica
146f0 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73  tion gives the s
14700 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75  ame result.** bu
14710 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63  t only has to sc
14720 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65  an the data once
14730 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69  .  And because i
14740 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a  ndices might .**
14750 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61   exist on the ta
14760 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65  ble t1, a comple
14770 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64  te scan of the d
14780 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ata might be.** 
14790 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  avoided..**.** F
147a0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c  lattening is onl
147b0 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61  y attempted if a
147c0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
147d0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
147e0 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73  .**   (1)  The s
147f0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
14800 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
14810 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72  ot both use aggr
14820 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  egates..**.**   
14830 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (2)  The subquer
14840 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
14850 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74  egate or the out
14860 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
14870 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
14880 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (3)  The subquer
14890 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67  y is not the rig
148a0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
148b0 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a  left outer join.
148c0 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67 69  **        (Origi
148d0 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30  nally ticket #30
148e0 36 2e 20 20 53 74 72 65 6e 67 68 74 65 6e 65 64  6.  Strenghtened
148f0 20 62 79 20 74 69 63 6b 65 74 20 23 33 33 30 30   by ticket #3300
14900 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54  ).**.**   (4)  T
14910 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
14920 6f 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74  ot DISTINCT or t
14930 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
14940 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
14950 0a 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20 73  .**   (5)  The s
14960 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
14970 49 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f  ISTINCT or the o
14980 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
14990 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
149a0 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
149b0 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73  .**   (6)  The s
149c0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
149d0 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
149e0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
149f0 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
14a00 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a      DISTINCT..**
14a10 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73  .**   (7)  The s
14a20 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52  ubquery has a FR
14a30 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
14a40 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71     (8)  The subq
14a50 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
14a60 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
14a70 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
14a80 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
14a90 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75    (9)  The subqu
14aa0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
14ab0 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
14ac0 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
14ad0 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
14ae0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
14af0 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75  **  (10)  The su
14b00 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
14b10 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
14b20 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
14b30 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20  y does not.**   
14b40 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a       use LIMIT..
14b50 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65  **.**  (11)  The
14b60 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
14b70 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
14b80 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f   not both have O
14b90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e  RDER BY clauses.
14ba0 0a 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 4e 6f  .**.**  (12)  No
14bb0 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20  t implemented.  
14bc0 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65  Subsumed into re
14bd0 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20  striction (3).  
14be0 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  Was previously.*
14bf0 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72  *        a separ
14c00 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20  ate restriction 
14c10 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69  deriving from ti
14c20 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a  cket #350..**.**
14c30 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71    (13)  The subq
14c40 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71  uery and outer q
14c50 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
14c60 20 75 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a   use LIMIT.**.**
14c70 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71    (14)  The subq
14c80 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
14c90 65 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20  e OFFSET.**.**  
14ca0 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20  (15)  The outer 
14cb0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72  query is not par
14cc0 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
14cd0 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a  select or the.**
14ce0 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
14cf0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 62   does not have b
14d00 6f 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  oth an ORDER BY 
14d10 61 6e 64 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  and a LIMIT clau
14d20 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53  se..**        (S
14d30 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 29  ee ticket #2339)
14d40 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68  .**.**  (16)  Th
14d50 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
14d60 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
14d70 65 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72  e or the subquer
14d80 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20  y does.**       
14d90 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44   not contain ORD
14da0 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20  ER BY.  (Ticket 
14db0 23 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65  #2942)  This use
14dc0 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a  d to not matter.
14dd0 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20  **        until 
14de0 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68  we introduced th
14df0 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29  e group_concat()
14e00 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a   function.  .**.
14e10 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75  **  (17)  The su
14e20 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  b-query is not a
14e30 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
14e40 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49  , or it is a UNI
14e50 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20  ON ALL .**      
14e60 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73    compound claus
14e70 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65  e made up entire
14e80 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67  ly of non-aggreg
14e90 61 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64  ate queries, and
14ea0 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20   .**        the 
14eb0 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a  parent query:.**
14ec0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
14ed0 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72  s not itself par
14ee0 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
14ef0 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20  select,.**      
14f00 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20      * is not an 
14f10 61 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53  aggregate or DIS
14f20 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64  TINCT query, and
14f30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 68  .**          * h
14f40 61 73 20 6e 6f 20 6f 74 68 65 72 20 74 61 62 6c  as no other tabl
14f50 65 73 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74  es or sub-select
14f60 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
14f70 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ause..**.**     
14f80 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e     The parent an
14f90 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20  d sub-query may 
14fa0 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c  contain WHERE cl
14fb0 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74  auses. Subject t
14fc0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65  o.**        rule
14fd0 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64  s (11), (13) and
14fe0 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20   (14), they may 
14ff0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44  also contain ORD
15000 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20  ER BY,.**       
15010 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
15020 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  T clauses..**.**
15030 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73    (18)  If the s
15040 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
15050 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
15060 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  hen all terms of
15070 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f   the.**        O
15080 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f  RDER by clause o
15090 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73  f the parent mus
150a0 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65  t be simple refe
150b0 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20  rences to .**   
150c0 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20       columns of 
150d0 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
150e0 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20  *.**  (19)  The 
150f0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
15100 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
15110 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
15120 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
15130 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63    have a WHERE c
15140 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  lause..**.** In 
15150 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
15160 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
15170 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
15180 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
15190 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79  .** The subquery
151a0 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   is p->pSrc->a[i
151b0 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73  From].  isAgg is
151c0 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   true if the out
151d0 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73  er query.** uses
151e0 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20   aggregates and 
151f0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73  subqueryIsAgg is
15200 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62   true if the sub
15210 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
15220 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gates..**.** If 
15230 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f  flattening is no
15240 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  t attempted, thi
15250 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
15260 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73  o-op and returns
15270 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65   0..** If flatte
15280 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65  ning is attempte
15290 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
152a0 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20  eturns 1..**.** 
152b0 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65  All of the expre
152c0 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d  ssion analysis m
152d0 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74  ust occur on bot
152e0 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  h the outer quer
152f0 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62  y and.** the sub
15300 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69  query before thi
15310 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a  s routine runs..
15320 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
15330 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20  attenSubquery(. 
15340 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15350 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
15360 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
15370 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
15380 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
15390 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54   or outer SELECT
153a0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
153b0 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
153c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
153d0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   p->pSrc->a[] of
153e0 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75   the inner subqu
153f0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ery */.  int isA
15400 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gg,           /*
15410 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53   True if outer S
15420 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65  ELECT uses aggre
15430 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
15440 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79  /.  int subquery
15450 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65  IsAgg    /* True
15460 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
15470 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
15480 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
15490 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
154a0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
154b0 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
154c0 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74  ontext;.  Select
154d0 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c   *pParent;.  Sel
154e0 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
154f0 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
15500 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
15510 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  " */.  Select *p
15520 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f  Sub1;      /* Po
15530 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67  inter to the rig
15540 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e  htmost select in
15550 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20   sub-query */.  
15560 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
15570 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
15580 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
15590 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  ter query */.  S
155a0 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b  rcList *pSubSrc;
155b0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
155c0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
155d0 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c  query */.  ExprL
155e0 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f  ist *pList;    /
155f0 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
15600 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
15610 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ery */.  int iPa
15620 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  rent;        /* 
15630 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
15640 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72  er of the pSub r
15650 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74  esult set temp t
15660 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15680 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
15690 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156b0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
156c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
156d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
156e0 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a   *pSubitem;   /*
156f0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   The subquery */
15700 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
15710 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
15720 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
15730 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  if flattening is
15740 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74   permitted.  Ret
15750 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20  urn 0 if not..  
15760 2a 2f 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  */.  if( p==0 ) 
15770 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
15780 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
15790 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46  sert( pSrc && iF
157a0 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c  rom>=0 && iFrom<
157b0 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
157c0 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63  pSubitem = &pSrc
157d0 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50  ->a[iFrom];.  iP
157e0 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
157f0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75  ->iCursor;.  pSu
15800 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
15810 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
15820 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
15830 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
15840 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
15850 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
15860 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
15870 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66  ion (1)  */.  if
15880 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
15890 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
158a0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
158b0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
158c0 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53  ion (2)  */.  pS
158d0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
158e0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
158f0 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
15900 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
15910 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
15920 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
15930 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
15940 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
15950 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
15960 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f  sssions, we allo
15970 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69  wed some combini
15980 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20  ng of LIMIT and 
15990 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
159a0 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62  use they could b
159b0 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f  e computed at co
159c0 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74  mpile-time.  But
159d0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
159e0 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
159f0 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70  me arbitrary exp
15a00 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72  ressions, we wer
15a10 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20  e forced to add 
15a20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33  restrictions (13
15a30 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e  ).  ** and (14).
15a40 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
15a50 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
15a60 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a80 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29  Restriction (13)
15a90 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
15aa0 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e  pOffset ) return
15ab0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15ad0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29  Restriction (14)
15ae0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52 69   */.  if( p->pRi
15af0 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75 62 2d  ghtmost && pSub-
15b00 3e 70 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d  >pLimit && pSub-
15b10 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
15b20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
15b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b50 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
15b60 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d  tion (15) */.  }
15b70 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
15b80 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
15b90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
15ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
15bb0 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
15bc0 0a 20 20 69 66 28 20 28 28 70 53 75 62 2d 3e 73  .  if( ((pSub->s
15bd0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
15be0 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 75  tinct)!=0 || pSu
15bf0 62 2d 3e 70 4c 69 6d 69 74 29 20 0a 20 20 20 20  b->pLimit) .    
15c00 20 20 20 20 20 26 26 20 28 70 53 72 63 2d 3e 6e       && (pSrc->n
15c10 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20  Src>1 || isAgg) 
15c20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ){          /* R
15c30 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 28  estrictions (4)(
15c40 35 29 28 38 29 28 39 29 20 2a 2f 0a 20 20 20 20  5)(8)(9) */.    
15c50 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
15c60 20 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e   .  }.  if( (p->
15c70 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
15c80 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75  stinct)!=0 && su
15c90 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
15ca0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
15cb0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
15cc0 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d  tion (6)  */.  }
15cd0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
15ce0 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
15cf0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
15d00 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d30 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
15d40 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
15d50 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
15d60 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
15d70 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
15d80 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
15d90 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66  ion (16) */.  if
15da0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
15db0 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  & p->pWhere ) re
15dc0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
15dd0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
15de0 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 0a 20 20 2f  ion (19) */..  /
15df0 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
15e00 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 1:.  ** Restr
15e10 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20 74 68  iction 3:  If th
15e20 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20  e subquery is a 
15e30 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  join, make sure 
15e40 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
15e50 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61  .  ** not used a
15e60 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
15e70 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65 72 20  and of an outer 
15e80 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20  join.  Examples 
15e90 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 2a 2a  of why this.  **
15ea0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a   is not allowed:
15eb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
15ec0 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52     t1 LEFT OUTER
15ed0 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74   JOIN (t2 JOIN t
15ee0 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  3).  **.  ** If 
15ef0 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61  we flatten the a
15f00 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67  bove, we would g
15f10 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  et.  **.  **    
15f20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55       (t1 LEFT OU
15f30 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49  TER JOIN t2) JOI
15f40 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  N t3.  **.  ** w
15f50 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74 20 61  hich is not at a
15f60 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  ll the same thin
15f70 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53  g..  **.  ** OBS
15f80 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a  OLETE COMMENT 2:
15f90 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
15fa0 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20 73 75  n 12:  If the su
15fb0 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69  bquery is the ri
15fc0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
15fd0 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a   left outer.  **
15fe0 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65   join, make sure
15ff0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61   the subquery ha
16000 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
16010 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70  e..  ** An examp
16020 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73 20  les of why this 
16030 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a  is not allowed:.
16040 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
16050 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20    t1 LEFT OUTER 
16060 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46  JOIN (SELECT * F
16070 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74 32 2e  ROM t2 WHERE t2.
16080 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  x>0).  **.  ** I
16090 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
160a0 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
160b0 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
160c0 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
160d0 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 57  OUTER JOIN t2) W
160e0 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a  HERE t2.x>0.  **
160f0 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 74 32  .  ** But the t2
16100 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c 20 61  .x>0 test will a
16110 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20 61 20  lways fail on a 
16120 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20  NULL row of t2, 
16130 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66 65 63  which.  ** effec
16140 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74 73 20  tively converts 
16150 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69  the OUTER JOIN i
16160 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49  nto an INNER JOI
16170 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49  N..  **.  ** THI
16180 53 20 4f 56 45 52 52 49 44 45 53 20 4f 42 53 4f  S OVERRIDES OBSO
16190 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20  LETE COMMENTS 1 
161a0 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a  AND 2 ABOVE:.  *
161b0 2a 20 54 69 63 6b 65 74 20 23 33 33 30 30 20 73  * Ticket #3300 s
161c0 68 6f 77 73 20 74 68 61 74 20 66 6c 61 74 74 65  hows that flatte
161d0 6e 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 74  ning the right t
161e0 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
161f0 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61 75 67  IN.  ** is fraug
16200 68 74 20 77 69 74 68 20 64 61 6e 67 65 72 2e 20  ht with danger. 
16210 20 42 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74   Best to avoid t
16220 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20  he whole thing. 
16230 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62   If the.  ** sub
16240 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
16250 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46  ht term of a LEF
16260 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20  T JOIN, then do 
16270 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a  not flatten..  *
16280 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65  /.  if( (pSubite
16290 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
162a0 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20  _OUTER)!=0 ){.  
162b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
162c0 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  .  /* Restrictio
162d0 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62  n 17: If the sub
162e0 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
162f0 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65  ound SELECT, the
16300 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75  n it must.  ** u
16310 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f  se only the UNIO
16320 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20  N ALL operator. 
16330 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  And none of the 
16340 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75  simple select qu
16350 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  eries.  ** that 
16360 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70  make up the comp
16370 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20  ound SELECT are 
16380 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67  allowed to be ag
16390 67 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69  gregate or disti
163a0 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  nct.  ** queries
163b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  ..  */.  if( pSu
163c0 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  b->pPrior ){.   
163d0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 7c   if( p->pPrior |
163e0 7c 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73  | isAgg || (p->s
163f0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
16400 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72  tinct)!=0 || pSr
16410 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
16420 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16430 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
16440 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
16450 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
16460 6f 72 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  or){.      if( (
16470 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
16480 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
16490 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30  F_Aggregate))!=0
164a0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62  .       || (pSub
164b0 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  1->pPrior && pSu
164c0 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  b1->op!=TK_ALL) 
164d0 0a 20 20 20 20 20 20 20 7c 7c 20 21 70 53 75 62  .       || !pSub
164e0 31 2d 3e 70 53 72 63 20 7c 7c 20 70 53 75 62 31  1->pSrc || pSub1
164f0 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 0a  ->pSrc->nSrc!=1.
16500 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
16510 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
16520 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
16530 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e   Restriction 18.
16540 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
16550 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
16560 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66   int ii;.      f
16570 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70  or(ii=0; ii<p->p
16580 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
16590 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ii++){.        i
165a0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  f( p->pOrderBy->
165b0 61 5b 69 69 5d 2e 69 43 6f 6c 3d 3d 30 20 29 20  a[ii].iCol==0 ) 
165c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
165d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
165e0 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63  ***** If we reac
165f0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c  h this point, fl
16600 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d  attening is perm
16610 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20  itted. *****/.. 
16620 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68   /* Authorize th
16630 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
16640 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
16650 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d  text = pSubitem-
16660 3e 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  >zName;.  sqlite
16670 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
16680 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
16690 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 70 50  , 0, 0, 0);.  pP
166a0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
166b0 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
166c0 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66  ontext;..  /* If
166d0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
166e0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
166f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
16700 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74  hen (by restrict
16710 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64  ions.  ** 17 and
16720 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75   18 above) it mu
16730 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
16740 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74  L and the parent
16750 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a   query must .  *
16760 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  * be of the form
16770 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
16780 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73  SELECT <expr-lis
16790 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75  t> FROM (<sub-qu
167a0 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61  ery>) <where-cla
167b0 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  use> .  **.  ** 
167c0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20  followed by any 
167d0 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
167e0 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c  and/or OFFSET cl
167f0 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63  auses. This bloc
16800 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e  k.  ** creates N
16810 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
16820 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68  arent query with
16830 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59  out any ORDER BY
16840 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a  , LIMIT or .  **
16850 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20   OFFSET clauses 
16860 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74  and joins them t
16870 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d  o the left-hand-
16880 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67  side of the orig
16890 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20  inal.  ** using 
168a0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
168b0 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ors. In this cas
168c0 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
168d0 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a  r of simple.  **
168e0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
168f0 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75  ts in the compou
16900 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  nd sub-query..  
16910 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
16920 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
16930 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
16940 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
16950 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
16960 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
16970 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
16980 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
16990 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
169a0 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20  Expr *pOffset = 
169b0 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
169c0 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
169d0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
169e0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
169f0 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
16a00 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
16a10 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
16a20 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  it = 0;.    pNew
16a30 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
16a40 44 75 70 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  Dup(db, p);.    
16a50 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
16a60 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50  Prior;.    p->pP
16a70 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  rior = pNew;.   
16a80 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
16a90 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e  OrderBy;.    p->
16aa0 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
16ab0 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b   p->pSrc = pSrc;
16ac0 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
16ad0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
16ae0 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
16af0 74 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74  t;.    p->pRight
16b00 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  most = 0;.    pN
16b10 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d  ew->pRightmost =
16b20 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   0;.  }..  /* Be
16b30 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  gin flattening t
16b40 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  he iFrom-th entr
16b50 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
16b60 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68  ause .  ** in th
16b70 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
16b80 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75   */.  pSub = pSu
16b90 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  b1 = pSubitem->p
16ba0 53 65 6c 65 63 74 3b 0a 20 20 66 6f 72 28 70 50  Select;.  for(pP
16bb0 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74  arent=p; pParent
16bc0 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e  ; pParent=pParen
16bd0 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d  t->pPrior, pSub=
16be0 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
16bf0 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 20 3d     int nSubSrc =
16c00 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 0a   pSubSrc->nSrc;.
16c10 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65      int jointype
16c20 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72   = 0;.    pSubSr
16c30 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
16c40 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
16c50 6e 74 2d 3e 70 53 72 63 3b 0a 0a 20 20 20 20 2f  nt->pSrc;..    /
16c60 2a 20 4d 6f 76 65 20 61 6c 6c 20 6f 66 20 74 68  * Move all of th
16c70 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
16c80 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
16c90 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
16ca0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
16cb0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
16cc0 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e  ry.  Before doin
16cd0 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72  g this, remember
16ce0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
16cf0 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
16d00 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72  e original outer
16d10 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d   query FROM elem
16d20 65 6e 74 20 69 6e 0a 20 20 20 20 2a 2a 20 69 50  ent in.    ** iP
16d30 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72  arent.  The iPar
16d40 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ent cursor will 
16d50 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20  never be used.  
16d60 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a  Subsequent code.
16d70 20 20 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e      ** will scan
16d80 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
16d90 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
16da0 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
16db0 72 65 70 6c 61 63 65 0a 20 20 20 20 2a 2a 20 74  replace.    ** t
16dc0 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20  hose references 
16dd0 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73  with expressions
16de0 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f   that resolve to
16df0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52   the subquery FR
16e00 4f 4d 0a 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e  OM.    ** elemen
16e10 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
16e20 70 79 69 6e 67 20 69 6e 2e 0a 20 20 20 20 2a 2f  pying in..    */
16e30 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29 7b  .    if( pSrc ){
16e40 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
16e50 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 20 20 70  abToDel;.      p
16e60 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d  Subitem = &pSrc-
16e70 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20  >a[iFrom];.     
16e80 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53   nSubSrc = pSubS
16e90 72 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 20 20  rc->nSrc;.      
16ea0 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
16eb0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
16ec0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
16ed0 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
16ee0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
16ef0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16f00 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
16f10 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Name);.      sql
16f20 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16f30 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
16f40 3b 0a 20 20 20 20 20 20 70 53 75 62 69 74 65 6d  ;.      pSubitem
16f50 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b  ->zDatabase = 0;
16f60 0a 20 20 20 20 20 20 70 53 75 62 69 74 65 6d 2d  .      pSubitem-
16f70 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  >zName = 0;.    
16f80 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
16f90 61 73 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  as = 0;..      /
16fa0 2a 20 49 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  * If the FROM el
16fb0 65 6d 65 6e 74 20 69 73 20 61 20 73 75 62 71 75  ement is a subqu
16fc0 65 72 79 2c 20 64 65 66 65 72 20 64 65 6c 65 74  ery, defer delet
16fd0 69 6e 67 20 74 68 65 20 54 61 62 6c 65 0a 20 20  ing the Table.  
16fe0 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61 73      ** object as
16ff0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
17000 61 74 20 73 75 62 71 75 65 72 79 20 75 6e 74 69  at subquery unti
17010 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
17020 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 6f  n is.      ** co
17030 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68  mplete, since th
17040 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78  ere may still ex
17050 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e  ist Expr.pTab en
17060 74 69 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  tires that.     
17070 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65   ** refer to the
17080 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61   subquery even a
17090 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e  fter flattening.
170a0 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a    Ticket #3346..
170b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
170c0 66 28 20 28 70 54 61 62 54 6f 44 65 6c 20 3d 20  f( (pTabToDel = 
170d0 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 29 21  pSubitem->pTab)!
170e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
170f0 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65  ( pTabToDel->nRe
17100 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  f==1 ){.        
17110 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65    pTabToDel->pNe
17120 78 74 5a 6f 6d 62 69 65 20 3d 20 70 50 61 72 73  xtZombie = pPars
17130 65 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20  e->pZombieTab;. 
17140 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
17150 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54  >pZombieTab = pT
17160 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 20 20 20  abToDel;.       
17170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17180 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65    pTabToDel->nRe
17190 66 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  f--;.        }. 
171a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 75       }.      pSu
171b0 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  bitem->pTab = 0;
171c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
171d0 53 75 62 53 72 63 21 3d 31 20 7c 7c 20 21 70 53  SubSrc!=1 || !pS
171e0 72 63 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rc ){.      int 
171f0 65 78 74 72 61 20 3d 20 6e 53 75 62 53 72 63 20  extra = nSubSrc 
17200 2d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  - 1;.      for(i
17210 3d 28 70 53 72 63 3f 31 3a 30 29 3b 20 69 3c 6e  =(pSrc?1:0); i<n
17220 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
17230 20 20 20 20 20 20 70 53 72 63 20 3d 20 73 71 6c        pSrc = sql
17240 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
17250 64 28 64 62 2c 20 70 53 72 63 2c 20 30 2c 20 30  d(db, pSrc, 0, 0
17260 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
17270 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
17280 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
17290 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
172a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
172b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
172c0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63     pParent->pSrc
172d0 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 20 20 66   = pSrc;.      f
172e0 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
172f0 31 3b 20 69 2d 65 78 74 72 61 3e 3d 69 46 72 6f  1; i-extra>=iFro
17300 6d 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20  m; i--){.       
17310 20 70 53 72 63 2d 3e 61 5b 69 5d 20 3d 20 70 53   pSrc->a[i] = pS
17320 72 63 2d 3e 61 5b 69 2d 65 78 74 72 61 5d 3b 0a  rc->a[i-extra];.
17330 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17340 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
17350 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
17360 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
17370 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
17380 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  i];.      memset
17390 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c  (&pSubSrc->a[i],
173a0 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53   0, sizeof(pSubS
173b0 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20  rc->a[i]));.    
173c0 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46  }.    pSrc->a[iF
173d0 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  rom].jointype = 
173e0 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20  jointype;.  .   
173f0 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75   /* Now begin su
17400 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75  bstituting subqu
17410 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65  ery result set e
17420 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a  xpressions for .
17430 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
17440 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74  s to the iParent
17450 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
17460 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  ery..    ** .   
17470 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
17480 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c   **.    **   SEL
17490 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52  ECT a+5, b*10 FR
174a0 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41  OM (SELECT x*3 A
174b0 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46  S a, y+10 AS b F
174c0 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e  ROM t1) WHERE a>
174d0 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20  b;.    **   \   
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174f0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
17500 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f   subquery ______
17510 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f  ____/          /
17520 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f  .    **    \____
17530 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
17540 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f  _ outer query __
17550 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
17560 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20  ____________/.  
17570 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c    **.    ** We l
17580 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70  ook at every exp
17590 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f  ression in the o
175a0 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65  uter query and e
175b0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
175c0 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20  e.    ** "a" we 
175d0 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22  substitute "x*3"
175e0 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
175f0 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73   we see "b" we s
17600 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22  ubstitute "y+10"
17610 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69  ..    */.    pLi
17620 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45  st = pParent->pE
17630 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  List;.    for(i=
17640 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
17650 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; i++){.      E
17660 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20  xpr *pExpr;.    
17670 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
17680 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70  ].zName==0 && (p
17690 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
176a0 69 5d 2e 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e  i].pExpr)->span.
176b0 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z!=0 ){.        
176c0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
176d0 65 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20  e = .           
176e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72      sqlite3DbStr
176f0 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
17700 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70  pExpr->span.z, p
17710 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20  Expr->span.n);. 
17720 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17730 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
17740 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69  b, pParent->pELi
17750 73 74 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  st, iParent, pSu
17760 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
17770 69 66 28 20 69 73 41 67 67 20 29 7b 0a 20 20 20  if( isAgg ){.   
17780 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
17790 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47  (db, pParent->pG
177a0 72 6f 75 70 42 79 2c 20 69 50 61 72 65 6e 74 2c  roupBy, iParent,
177b0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a   pSub->pEList);.
177c0 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 28        substExpr(
177d0 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
177e0 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
177f0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
17800 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62    }.    if( pSub
17810 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
17820 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
17830 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ent->pOrderBy==0
17840 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
17850 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t->pOrderBy = pS
17860 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
17870 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72      pSub->pOrder
17880 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  By = 0;.    }els
17890 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70  e if( pParent->p
178a0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
178b0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
178c0 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  b, pParent->pOrd
178d0 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  erBy, iParent, p
178e0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
178f0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62    }.    if( pSub
17900 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
17910 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
17920 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
17930 75 62 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  ub->pWhere);.   
17940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57   }else{.      pW
17950 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  here = 0;.    }.
17960 20 20 20 20 69 66 28 20 73 75 62 71 75 65 72 79      if( subquery
17970 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61  IsAgg ){.      a
17980 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
17990 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20  pHaving==0 );.  
179a0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
179b0 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e  ving = pParent->
179c0 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50  pWhere;.      pP
179d0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
179e0 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 73 75  pWhere;.      su
179f0 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
17a00 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  ent->pHaving, iP
17a10 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
17a20 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
17a30 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
17a40 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
17a50 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
17a60 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ng, .           
17a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
17a90 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
17aa0 70 48 61 76 69 6e 67 29 29 3b 0a 20 20 20 20 20  pHaving));.     
17ab0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
17ac0 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b  ->pGroupBy==0 );
17ad0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
17ae0 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
17af0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
17b00 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79  , pSub->pGroupBy
17b10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17b20 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62      substExpr(db
17b30 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
17b40 65 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  e, iParent, pSub
17b50 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
17b60 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
17b70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
17b80 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  d(db, pParent->p
17b90 57 68 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a  Where, pWhere);.
17ba0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
17bb0 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75  The flattened qu
17bc0 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20  ery is distinct 
17bd0 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e  if either the in
17be0 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ner or the.    *
17bf0 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  * outer query is
17c00 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20   distinct. .    
17c10 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  */.    pParent->
17c20 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62  selFlags |= pSub
17c30 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
17c40 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20  Distinct;.  .   
17c50 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43   /*.    ** SELEC
17c60 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
17c70 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
17c80 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
17c90 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a   OFFSET y;.    *
17ca0 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20  *.    ** One is 
17cb0 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74  tempted to try t
17cc0 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f  o add a and b to
17cd0 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d   combine the lim
17ce0 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20  its.  But this. 
17cf0 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77     ** does not w
17d00 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69  ork if either li
17d10 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
17d20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17d30 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
17d40 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
17d50 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c  Limit = pSub->pL
17d60 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62  imit;.      pSub
17d70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
17d80 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
17d90 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77  nially, delete w
17da0 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74  hat is left of t
17db0 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
17dc0 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63  return.  ** succ
17dd0 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
17de0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
17df0 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20 72  db, pSub1);..  r
17e00 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
17e10 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
17e20 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
17e30 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
17e40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
17e50 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  ) */../*.** Anal
17e60 79 7a 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  yze the SELECT s
17e70 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
17e80 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74  as an argument t
17e90 6f 20 73 65 65 20 69 66 20 69 74 0a 2a 2a 20 69  o see if it.** i
17ea0 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  s a min() or max
17eb0 28 29 20 71 75 65 72 79 2e 20 52 65 74 75 72 6e  () query. Return
17ec0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
17ed0 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45  IN or WHERE_ORDE
17ee0 52 42 59 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69  RBY_MAX if .** i
17ef0 74 20 69 73 2c 20 6f 72 20 30 20 6f 74 68 65 72  t is, or 0 other
17f00 77 69 73 65 2e 20 41 74 20 70 72 65 73 65 6e 74  wise. At present
17f10 2c 20 61 20 71 75 65 72 79 20 69 73 20 63 6f 6e  , a query is con
17f20 73 69 64 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a  sidered to be.**
17f30 20 61 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71   a min()/max() q
17f40 75 65 72 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  uery if:.**.**  
17f50 20 31 2e 20 54 68 65 72 65 20 69 73 20 61 20 73   1. There is a s
17f60 69 6e 67 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20  ingle object in 
17f70 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
17f80 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72  .**.**   2. Ther
17f90 65 20 69 73 20 61 20 73 69 6e 67 6c 65 20 65 78  e is a single ex
17fa0 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
17fb0 72 65 73 75 6c 74 20 73 65 74 2c 20 61 6e 64 20  result set, and 
17fc0 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 65 69  it is.**      ei
17fd0 74 68 65 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d  ther min(x) or m
17fe0 61 78 28 78 29 2c 20 77 68 65 72 65 20 78 20 69  ax(x), where x i
17ff0 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  s a column refer
18000 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ence..*/.static 
18010 69 6e 74 20 6d 69 6e 4d 61 78 51 75 65 72 79 28  int minMaxQuery(
18020 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
18030 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 45 78 70  elect *p){.  Exp
18040 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72  r *pExpr;.  Expr
18050 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
18060 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28  ->pEList;..  if(
18070 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
18080 31 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45  1 ) return WHERE
18090 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
180a0 0a 20 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73  .  pExpr = pELis
180b0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
180c0 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
180d0 3e 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45  >pList;.  if( pE
180e0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
180f0 46 55 4e 43 54 49 4f 4e 20 7c 7c 20 70 45 4c 69  FUNCTION || pELi
18100 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d  st==0 || pEList-
18110 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
18120 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 4c 69  rn 0;.  if( pELi
18130 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
18140 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
18150 4e 20 29 20 72 65 74 75 72 6e 20 57 48 45 52 45  N ) return WHERE
18160 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
18170 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f  .  if( pExpr->to
18180 6b 65 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72  ken.n!=3 ) retur
18190 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
181a0 4e 4f 52 4d 41 4c 3b 0a 20 20 69 66 28 20 73 71  NORMAL;.  if( sq
181b0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63  lite3StrNICmp((c
181c0 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65  har*)pExpr->toke
181d0 6e 2e 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20  n.z,"min",3)==0 
181e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48  ){.    return WH
181f0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b  ERE_ORDERBY_MIN;
18200 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
18210 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
18220 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  ar*)pExpr->token
18230 2e 7a 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29  .z,"max",3)==0 )
18240 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48 45  {.    return WHE
18250 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a  RE_ORDERBY_MAX;.
18260 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 48 45    }.  return WHE
18270 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
18280 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  L;.}../*.** If t
18290 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69  he source-list i
182a0 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e  tem passed as an
182b0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75   argument was au
182c0 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a  gmented with an.
182d0 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
182e0 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74  ause, then try t
182f0 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65  o locate the spe
18300 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66  cified index. If
18310 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75   there.** was su
18320 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20  ch a clause and 
18330 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
18340 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
18350 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
18360 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61  TE_ERROR and lea
18370 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
18380 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65  Parse. Otherwise
18390 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70  , populate .** p
183a0 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64  From->pIndex and
183b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
183c0 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
183d0 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
183e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
183f0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
18400 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
18410 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26  f( pFrom->pTab &
18420 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20  & pFrom->zIndex 
18430 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
18440 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
18450 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64  ;.    char *zInd
18460 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64  ex = pFrom->zInd
18470 65 78 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  ex;.    Index *p
18480 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
18490 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
184a0 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26  .        pIdx &&
184b0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
184c0 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e  pIdx->zName, zIn
184d0 64 65 78 29 3b 20 0a 20 20 20 20 20 20 20 20 70  dex); .        p
184e0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a  Idx=pIdx->pNext.
184f0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
18500 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71  pIdx ){.      sq
18510 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18520 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
18530 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65  ndex: %s", zInde
18540 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  x, 0);.      ret
18550 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
18560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f  ;.    }.    pFro
18570 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  m->pIndex = pIdx
18580 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
18590 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
185a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
185b0 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
185c0 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
185d0 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
185e0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
185f0 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
18600 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
18610 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
18620 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
18630 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
18640 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
18650 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
18660 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
18670 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18680 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
18690 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
186a0 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
186b0 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
186c0 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
186d0 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
186e0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
186f0 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
18700 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18710 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
18720 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
18730 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
18740 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
18750 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
18760 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
18770 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
18780 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
18790 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
187a0 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
187b0 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
187c0 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
187d0 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
187e0 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
187f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
18800 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
18810 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
18820 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70  e presistent rep
18830 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
18840 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
18850 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
18860 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
18870 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
18880 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
18890 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
188a0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
188b0 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
188c0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
188d0 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
188e0 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
188f0 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
18900 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
18910 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
18920 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
18930 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
18940 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
18950 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
18960 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
18970 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
18980 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
18990 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
189a0 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
189b0 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
189c0 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
189d0 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
189e0 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  TABLE..**.*/.sta
189f0 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78  tic int selectEx
18a00 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70  pander(Walker *p
18a10 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
18a20 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
18a30 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
18a40 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20  Parse;.  int i, 
18a50 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20  j, k;.  SrcList 
18a60 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
18a70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
18a80 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
18a90 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  item *pFrom;.  s
18aa0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
18ab0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  rse->db;..  if( 
18ac0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18ad0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
18ae0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
18af0 20 69 66 28 20 70 2d 3e 70 53 72 63 3d 3d 30 20   if( p->pSrc==0 
18b00 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
18b10 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d  & SF_Expanded)!=
18b20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
18b30 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
18b40 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
18b50 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 70  SF_Expanded;.  p
18b60 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
18b70 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
18b80 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d  >pEList;..  /* M
18b90 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
18ba0 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
18bb0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
18bc0 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
18bd0 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
18be0 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
18bf0 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
18c00 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
18c10 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
18c20 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
18c30 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
18c40 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
18c50 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
18c60 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
18c70 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
18c80 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
18c90 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
18ca0 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
18cb0 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
18cc0 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
18cd0 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
18ce0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
18cf0 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
18d00 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
18d10 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
18d20 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
18d30 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
18d40 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
18d50 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
18d60 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
18d70 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  b!=0 ){.      /*
18d80 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
18d90 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
18da0 20 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72   prepared.  Ther
18db0 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
18dc0 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74     ** to go furt
18dd0 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  her. */.      as
18de0 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20  sert( i==0 );.  
18df0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
18e00 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rune;.    }.    
18e10 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
18e20 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
18e30 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
18e40 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74  ERY.      Select
18e50 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
18e60 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f  pSelect;.      /
18e70 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
18e80 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
18e90 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
18ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
18eb0 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  el!=0 );.      a
18ec0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
18ed0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ab==0 );.      s
18ee0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
18ef0 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
18f00 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
18f10 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
18f20 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
18f30 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
18f40 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ));.      if( pT
18f50 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
18f60 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
18f70 70 54 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  pTab->db = db;. 
18f80 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20       pTab->nRef 
18f90 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  = 1;.      pTab-
18fa0 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
18fb0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c  MPrintf(db, "sql
18fc0 69 74 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f  ite_subquery_%p_
18fd0 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b  ", (void*)pTab);
18fe0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53  .      while( pS
18ff0 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53  el->pPrior ){ pS
19000 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
19010 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63  r; }.      selec
19020 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
19030 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
19040 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  l->pEList, &pTab
19050 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
19060 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Col);.      pTab
19070 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
19080 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
19090 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
190a0 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  al;.#endif.    }
190b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
190c0 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  n ordinary table
190d0 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e   or view name in
190e0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
190f0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
19100 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
19110 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d   );.      pFrom-
19120 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a  >pTab = pTab = .
19130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
19140 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
19150 65 2c 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  e,0,pFrom->zName
19160 2c 70 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73  ,pFrom->zDatabas
19170 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
19180 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
19190 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
191a0 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69  pTab->nRef++;.#i
191b0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
191c0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
191d0 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45  !defined (SQLITE
191e0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
191f0 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 70 54  LE).      if( pT
19200 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49  ab->pSelect || I
19210 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
19220 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
19230 72 65 61 63 68 20 68 65 72 65 20 69 66 20 74 68  reach here if th
19240 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
19250 20 61 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77   a really a view
19260 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
19270 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
19280 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
19290 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  , pTab) ) return
192a0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20   WRC_Abort;..   
192b0 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d       /* If pFrom
192c0 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20  ->pSelect!=0 it 
192d0 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
192e0 6c 69 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20  ling with a.    
192f0 20 20 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68      ** view with
19300 69 6e 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  in a view.  The 
19310 53 45 4c 45 43 54 20 73 74 72 75 63 74 75 72 65  SELECT structure
19320 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
19330 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  n.        ** cop
19340 69 65 64 20 62 79 20 74 68 65 20 6f 75 74 65 72  ied by the outer
19350 20 76 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20   view so we can 
19360 73 6b 69 70 20 74 68 65 20 63 6f 70 79 20 73 74  skip the copy st
19370 65 70 20 68 65 72 65 0a 20 20 20 20 20 20 20 20  ep here.        
19380 2a 2a 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ** in the inner 
19390 76 69 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  view..        */
193a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72  .        if( pFr
193b0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
193c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f  {.          pFro
193d0 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
193e0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
193f0 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29  , pTab->pSelect)
19400 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
19410 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
19420 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53  alker, pFrom->pS
19430 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
19440 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
19450 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
19460 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
19470 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44  named by the IND
19480 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
19490 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
194a0 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  f( sqlite3Indexe
194b0 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  dByLookup(pParse
194c0 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
194d0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
194e0 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rt;.    }.  }.. 
194f0 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
19500 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
19510 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
19520 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
19530 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
19540 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
19550 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
19560 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  n(pParse, p) ){.
19570 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
19580 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  bort;.  }..  /* 
19590 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
195a0 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
195b0 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
195c0 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
195d0 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
195e0 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
195f0 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
19600 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
19610 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
19620 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
19630 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
19640 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
19650 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
19660 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
19670 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  TK_ALL operator 
19680 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
19690 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
196a0 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20  e column list.. 
196b0 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
196c0 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
196d0 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
196e0 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73  _ALL expressions
196f0 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a   and expand.  **
19700 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65   each one to the
19710 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c   list of all col
19720 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
19730 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
19740 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
19750 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
19760 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
19770 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
19780 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
19790 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
197a0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
197b0 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
197c0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
197d0 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70  EList->a[k].pExp
197e0 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  r;.    if( pE->o
197f0 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61  p==TK_ALL ) brea
19800 6b 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  k;.    if( pE->o
19810 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
19820 3e 70 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70  >pRight && pE->p
19830 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  Right->op==TK_AL
19840 4c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 45  L.         && pE
19850 2d 3e 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70  ->pLeft && pE->p
19860 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Left->op==TK_ID 
19870 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
19880 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  f( k<pEList->nEx
19890 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  pr ){.    /*.   
198a0 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65   ** If we get he
198b0 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  re it means the 
198c0 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61  result set conta
198d0 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
198e0 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  "*".    ** opera
198f0 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
19900 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20  o be expanded.  
19910 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
19920 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  h expression.   
19930 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c   ** in the resul
19940 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64  t set and expand
19950 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65   them one by one
19960 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72  ..    */.    str
19970 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
19980 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61  m *a = pEList->a
19990 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
199a0 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e  pNew = 0;.    in
199b0 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65  t flags = pParse
199c0 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  ->db->flags;.   
199d0 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d   int longNames =
199e0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
199f0 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
19a00 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
19a10 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67          && (flag
19a20 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74  s & SQLITE_Short
19a30 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20  ColNames)==0;.. 
19a40 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45     for(k=0; k<pE
19a50 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
19a60 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
19a70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
19a80 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
19a90 21 3d 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20  !=TK_ALL &&.    
19aa0 20 20 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d         (pE->op!=
19ab0 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
19ac0 69 67 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70  ight==0 || pE->p
19ad0 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  Right->op!=TK_AL
19ae0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  L) ){.        /*
19af0 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
19b00 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
19b10 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
19b20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
19b30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
19b40 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
19b50 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
19b60 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  , pNew, a[k].pEx
19b70 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
19b80 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
19b90 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
19ba0 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
19bb0 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
19bc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19bd0 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
19be0 30 3b 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  0;.        a[k].
19bf0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
19c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19c10 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
19c20 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
19c30 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
19c40 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
19c50 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
19c60 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
19c70 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
19c80 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
19c90 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
19ca0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
19cb0 72 20 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20  r *zTName;      
19cc0 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
19cd0 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
19ce0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
19cf0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
19d00 70 45 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pE->pLeft ){.   
19d10 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
19d20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
19d30 6f 6b 65 6e 28 64 62 2c 20 26 70 45 2d 3e 70 4c  oken(db, &pE->pL
19d40 65 66 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  eft->token);.   
19d50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19d60 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30        zTName = 0
19d70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19d80 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
19d90 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
19da0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
19db0 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
19dc0 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c 65  .          Table
19dd0 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
19de0 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
19df0 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
19e00 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pFrom->zAlias;.
19e10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
19e20 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61  abName==0 || zTa
19e30 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a  bName[0]==0 ){ .
19e40 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 62              zTab
19e50 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
19e60 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  me;.          }.
19e70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 62            if( db
19e80 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19e90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19ea0 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
19eb0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
19ec0 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
19ed0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
19ee0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
19ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19f00 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
19f10 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
19f20 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
19f30 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
19f40 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
19f50 2c 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20  , *pRight;.     
19f60 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
19f70 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
19f80 6a 5d 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20  j].zName;..     
19f90 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
19fa0 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
19fb0 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75 72  as 'hidden' (cur
19fc0 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73  rently only poss
19fd0 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  ible.           
19fe0 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20   ** for virtual 
19ff0 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20  tables), do not 
1a000 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68  include it in th
1a010 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
1a020 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
1a030 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20  -set list..     
1a040 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1a050 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64 64        if( IsHidd
1a060 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
1a070 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  aCol[j]) ){.    
1a080 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1a090 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  (IsVirtual(pTab)
1a0a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1a0b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1a0c0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1a0d0 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b        if( i>0 ){
1a0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
1a0f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1a100 65 6d 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61  em *pLeft = &pTa
1a110 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20  bList->a[i-1];. 
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1a130 20 28 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74   (pLeft[1].joint
1a140 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
1a150 29 21 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  )!=0 &&.        
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a170 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66  columnIndex(pLef
1a180 74 2d 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e  t->pTab, zName)>
1a190 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1a1a0 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
1a1b0 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
1a1c0 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
1a1d0 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
1a1e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1a1f0 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
1a200 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
1a210 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1a230 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1a240 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
1a250 64 65 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73  dex(pLeft[1].pUs
1a260 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29  ing, zName)>=0 )
1a270 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1a280 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77    /* In a join w
1a290 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75  ith a USING clau
1a2a0 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73  se, omit columns
1a2b0 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
1a2c0 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67          ** using
1a2d0 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65   clause from the
1a2e0 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69   table on the ri
1a2f0 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght. */.        
1a300 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1a310 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a320 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
1a330 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67              pRig
1a340 68 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ht = sqlite3PExp
1a350 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c  r(pParse, TK_ID,
1a360 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
1a370 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68         if( pRigh
1a380 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  t==0 ) break;.  
1a390 20 20 20 20 20 20 20 20 20 20 73 65 74 51 75 6f            setQuo
1a3a0 74 65 64 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  tedToken(pParse,
1a3b0 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c   &pRight->token,
1a3c0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
1a3d0 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
1a3e0 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
1a3f0 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSrc>1 ){.      
1a400 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
1a410 65 66 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  eft = sqlite3PEx
1a420 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44  pr(pParse, TK_ID
1a430 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
1a440 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
1a450 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1a460 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
1a470 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
1a480 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a490 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62  if( pExpr==0 ) b
1a4a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1a4b0 20 20 20 20 73 65 74 51 75 6f 74 65 64 54 6f 6b      setQuotedTok
1a4c0 65 6e 28 70 50 61 72 73 65 2c 20 26 70 4c 65 66  en(pParse, &pLef
1a4d0 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61  t->token, zTabNa
1a4e0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1a4f0 20 20 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78     setToken(&pEx
1a500 70 72 2d 3e 73 70 61 6e 2c 20 0a 20 20 20 20 20  pr->span, .     
1a510 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1a520 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1a530 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
1a540 65 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  e, zName));.    
1a550 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1a560 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20  >span.dyn = 1;. 
1a570 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1a580 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b  pr->token.z = 0;
1a590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1a5a0 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20  Expr->token.n = 
1a5b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
1a5c0 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79   pExpr->token.dy
1a5d0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
1a5e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a5f0 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
1a600 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
1a610 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
1a620 6e 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  n = pExpr->token
1a630 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1a640 70 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20  pExpr->span.dyn 
1a650 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
1a660 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
1a670 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a  f( longNames ){.
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
1a690 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1a6a0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1a6b0 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  e, pNew, pExpr, 
1a6c0 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20  &pExpr->span);. 
1a6d0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
1a6e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1a6f0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
1a700 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1a710 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
1a720 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e  , &pRight->token
1a730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
1a740 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1a750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1a760 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
1a770 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
1a780 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
1a790 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1a7a0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
1a7b0 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
1a7c0 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
1a7d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a7e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1a7f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1a800 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
1a810 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
1a820 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1a830 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
1a840 72 65 65 28 64 62 2c 20 7a 54 4e 61 6d 65 29 3b  ree(db, zTName);
1a850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a860 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
1a870 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c  stDelete(db, pEL
1a880 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
1a890 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
1a8a0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
1a8b0 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70  OLUMN.  if( p->p
1a8c0 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69  EList && p->pELi
1a8d0 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  st->nExpr>db->aL
1a8e0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
1a8f0 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
1a900 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a910 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
1a920 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  ny columns in re
1a930 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a  sult set");.  }.
1a940 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1a950 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
1a960 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75  ./*.** No-op rou
1a970 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72  tine for the par
1a980 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a  se-tree walker..
1a990 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1a9a0 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57  routine is the W
1a9b0 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
1a9c0 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73  ack then express
1a9d0 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65  ion trees.** are
1a9e0 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20   walked without 
1a9f0 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e  any actions bein
1aa00 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20  g taken at each 
1aa10 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c  node.  Presumabl
1aa20 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  y,.** when this 
1aa30 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1aa40 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  for Walker.xExpr
1aa50 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a  Callback then .*
1aa60 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74  * Walker.xSelect
1aa70 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20  Callback is set 
1aa80 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  to do something 
1aa90 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79  useful for every
1aaa0 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e   .** subquery in
1aab0 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65   the parser tree
1aac0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1aad0 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  exprWalkNoop(Wal
1aae0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78  ker *pWalker, Ex
1aaf0 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 72 65  pr *pExpr){.  re
1ab00 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1ab10 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
1ab20 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64   routine "expand
1ab30 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  s" a SELECT stat
1ab40 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66  ement and all of
1ab50 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e   its subqueries.
1ab60 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e  .** For addition
1ab70 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  al information o
1ab80 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20  n what it means 
1ab90 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45  to "expand" a SE
1aba0 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
1abb0 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  t, see the comme
1abc0 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74  nt on the select
1abd0 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61  Expand worker ca
1abe0 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a  llback above..**
1abf0 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20  .** Expanding a 
1ac00 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1ac10 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74   is the first st
1ac20 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  ep in processing
1ac30 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
1ac40 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c  tement.  The SEL
1ac50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75  ECT statement mu
1ac60 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
1ac70 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65  efore.** name re
1ac80 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66  solution is perf
1ac90 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormed..**.** If 
1aca0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
1acb0 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  ong, an error me
1acc0 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
1acd0 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a   into pParse..**
1ace0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
1acf0 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74  ction can detect
1ad00 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20   the problem by 
1ad10 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73  looking at pPars
1ad20 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f  e->nErr.** and/o
1ad30 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  r pParse->db->ma
1ad40 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73  llocFailed..*/.s
1ad50 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
1ad60 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50  e3SelectExpand(P
1ad70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
1ad80 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
1ad90 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
1ada0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1adb0 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
1adc0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
1add0 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f  ack = exprWalkNo
1ade0 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
1adf0 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74   pParse;.  sqlit
1ae00 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
1ae10 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23   pSelect);.}...#
1ae20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ae30 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
1ae40 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b  * This is a Walk
1ae50 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
1ae60 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ck callback for 
1ae70 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63  the sqlite3Selec
1ae80 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69  tTypeInfo().** i
1ae90 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  nterface..**.** 
1aea0 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c  For each FROM-cl
1aeb0 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61  ause subquery, a
1aec0 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20  dd Column.zType 
1aed0 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  and Column.zColl
1aee0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
1aef0 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  to the Table str
1af00 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
1af10 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
1af20 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74  t set.** of that
1af30 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a   subquery..**.**
1af40 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
1af50 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73  ture that repres
1af60 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20  ents the result 
1af70 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63  set was construc
1af80 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74  ted.** by select
1af90 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74  Expander() but t
1afa0 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  he type and coll
1afb0 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
1afc0 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a  n was omitted.**
1afd0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62   at that point b
1afe0 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65  ecause identifie
1aff0 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62  rs had not yet b
1b000 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54  een resolved.  T
1b010 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
1b020 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69  s called after i
1b030 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75  dentifier resolu
1b040 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1b050 69 6e 74 20 73 65 6c 65 63 74 41 64 64 53 75 62  int selectAddSub
1b060 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61  queryTypeInfo(Wa
1b070 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
1b080 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
1b090 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e  se *pParse;.  in
1b0a0 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  t i;.  SrcList *
1b0b0 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
1b0c0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1b0d0 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72  *pFrom;..  asser
1b0e0 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
1b0f0 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a   SF_Resolved );.
1b100 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
1b110 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
1b120 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nfo)==0 ){.    p
1b130 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
1b140 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20  _HasTypeInfo;.  
1b150 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
1b160 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  er->pParse;.    
1b170 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
1b180 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rc;.    for(i=0,
1b190 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
1b1a0 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
1b1b0 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
1b1c0 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  ++){.      Table
1b1d0 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
1b1e0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
1b1f0 70 54 61 62 20 26 26 20 28 70 54 61 62 2d 3e 74  pTab && (pTab->t
1b200 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
1b210 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20  emeral)!=0 ){.  
1b220 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
1b230 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
1b240 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1b250 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  ECT */.        S
1b260 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
1b270 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
1b280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1b290 65 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68  el );.        wh
1b2a0 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
1b2b0 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d  r ) pSel = pSel-
1b2c0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
1b2d0 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
1b2e0 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
1b2f0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e  (pParse, pTab->n
1b300 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c  Col, pTab->aCol,
1b310 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   pSel);.      }.
1b320 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1b330 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1b340 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1b350 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1b360 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
1b370 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1b380 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
1b390 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
1b3a0 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
1b3b0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
1b3c0 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
1b3d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1b3e0 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
1b3f0 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
1b400 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
1b410 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b420 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
1b430 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
1b440 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
1b450 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
1b460 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1b470 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
1b480 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  w;.  w.xSelectCa
1b490 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 41  llback = selectA
1b4a0 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
1b4b0 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  fo;.  w.xExprCal
1b4c0 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b  lback = exprWalk
1b4d0 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
1b4e0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c   = pParse;.  sql
1b4f0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
1b500 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e  w, pSelect);.#en
1b510 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.}.../*.** Th
1b520 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
1b530 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
1b540 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73  ement for proces
1b550 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f  sing.  The.** fo
1b560 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d  llowing is accom
1b570 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  plished:.**.**  
1b580 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f     *  VDBE Curso
1b590 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73  r numbers are as
1b5a0 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52  signed to all FR
1b5b0 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  OM-clause terms.
1b5c0 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d  .**     *  Ephem
1b5d0 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
1b5e0 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ts are created f
1b5f0 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  or all FROM-clau
1b600 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  se subqueries..*
1b610 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20  *     *  ON and 
1b620 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72  USING clauses ar
1b630 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57  e shifted into W
1b640 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a  HERE statements.
1b650 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61  **     *  Wildca
1b660 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42  rds "*" and "TAB
1b670 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20  LE.*" in result 
1b680 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65  sets are expande
1b690 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65  d..**     *  Ide
1b6a0 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72  ntifiers in expr
1b6b0 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68  ession are match
1b6c0 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a  ed to tables..**
1b6d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b6e0 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c   acts recursivel
1b6f0 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72  y on all subquer
1b700 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53  ies within the S
1b710 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
1b720 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
1b730 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1b740 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
1b750 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
1b760 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b780 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
1b790 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
1b7a0 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  . */.  NameConte
1b7b0 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a  xt *pOuterNC  /*
1b7c0 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
1b7d0 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29  r container */.)
1b7e0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1b7f0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1b800 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61  turn;.  db = pPa
1b810 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
1b820 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1b830 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65  HasTypeInfo ) re
1b840 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72  turn;.  if( pPar
1b850 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1b860 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
1b870 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
1b880 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61  SelectExpand(pPa
1b890 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  rse, p);.  if( p
1b8a0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
1b8b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b8c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1b8d0 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74  te3ResolveSelect
1b8e0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c  Names(pParse, p,
1b8f0 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66   pOuterNC);.  if
1b900 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1b910 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1b920 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
1b930 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
1b940 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  ypeInfo(pParse, 
1b950 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
1b960 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65  et the aggregate
1b970 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a   accumulator..**
1b980 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74  .** The aggregat
1b990 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73  e accumulator is
1b9a0 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79   a set of memory
1b9b0 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64   cells that hold
1b9c0 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65  .** intermediate
1b9d0 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63   results while c
1b9e0 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67  alculating an ag
1b9f0 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a  gregate.  This.*
1ba00 2a 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79  * routine simply
1ba10 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e   stores NULLs in
1ba20 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65   all of those me
1ba30 6d 6f 72 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  mory cells..*/.s
1ba40 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74  tatic void reset
1ba50 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73  Accumulator(Pars
1ba60 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
1ba70 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
1ba80 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1ba90 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1baa0 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
1bab0 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b  nfo_func *pFunc;
1bac0 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  .  if( pAggInfo-
1bad0 3e 6e 46 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d  >nFunc+pAggInfo-
1bae0 3e 6e 43 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20  >nColumn==0 ){. 
1baf0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1bb00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
1bb10 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  Info->nColumn; i
1bb20 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1bb30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1bb40 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
1bb50 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
1bb60 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 46 75  );.  }.  for(pFu
1bb70 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  nc=pAggInfo->aFu
1bb80 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49  nc, i=0; i<pAggI
1bb90 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
1bba0 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73   pFunc++){.    s
1bbb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1bbc0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
1bbd0 70 46 75 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20  pFunc->iMem);.  
1bbe0 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69    if( pFunc->iDi
1bbf0 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
1bc00 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46     Expr *pE = pF
1bc10 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  unc->pExpr;.    
1bc20 20 20 69 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d    if( pE->pList=
1bc30 3d 30 20 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d  =0 || pE->pList-
1bc40 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
1bc50 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1bc60 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49  rMsg(pParse, "DI
1bc70 53 54 49 4e 43 54 20 69 6e 20 61 67 67 72 65 67  STINCT in aggreg
1bc80 61 74 65 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c  ate must be foll
1bc90 6f 77 65 64 20 22 0a 20 20 20 20 20 20 20 20 20  owed ".         
1bca0 20 20 22 62 79 20 61 6e 20 65 78 70 72 65 73 73    "by an express
1bcb0 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ion");.        p
1bcc0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20  Func->iDistinct 
1bcd0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1bce0 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  e{.        KeyIn
1bcf0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b  fo *pKeyInfo = k
1bd00 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
1bd10 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 70  st(pParse, pE->p
1bd20 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73  List);.        s
1bd30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1bd40 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
1bd50 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  eral, pFunc->iDi
1bd60 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
1bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd80 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1bd90 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
1bda0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
1bdb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1bdc0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
1bdd0 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69  the OP_AggFinali
1bde0 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76  ze opcode for ev
1bdf0 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75  ery aggregate fu
1be00 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  nction.** in the
1be10 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
1be20 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
1be30 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75  id finalizeAggFu
1be40 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70  nctions(Parse *p
1be50 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
1be60 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
1be70 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1be80 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
1be90 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1bea0 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28  func *pF;.  for(
1beb0 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
1bec0 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
1bed0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
1bee0 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   pF++){.    Expr
1bef0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
1bf00 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  ->pExpr->pList;.
1bf10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bf20 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46  ddOp4(v, OP_AggF
1bf30 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20  inal, pF->iMem, 
1bf40 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
1bf50 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20  Expr : 0, 0,.   
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf70 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
1bf80 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
1bf90 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ;.  }.}../*.** U
1bfa0 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75  pdate the accumu
1bfb0 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c  lator memory cel
1bfc0 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67  ls for an aggreg
1bfd0 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ate based on.** 
1bfe0 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
1bff0 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
1c000 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61  static void upda
1c010 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  teAccumulator(Pa
1c020 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
1c030 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
1c040 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1c050 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1c060 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
1c070 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
1c080 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1c090 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67  _col *pC;..  pAg
1c0a0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
1c0b0 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 1;.  for(i=0
1c0c0 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
1c0d0 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
1c0e0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
1c0f0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ++){.    int nAr
1c100 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  g;.    int addrN
1c110 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
1c120 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70   regAgg;.    Exp
1c130 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
1c140 46 2d 3e 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b  F->pExpr->pList;
1c150 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
1c160 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70  {.      nArg = p
1c170 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
1c180 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69     regAgg = sqli
1c190 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1c1a0 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20  pParse, nArg);. 
1c1b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1c1c0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
1c1d0 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41  rse, pList, regA
1c1e0 67 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  gg, 0);.    }els
1c1f0 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
1c200 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  0;.      regAgg 
1c210 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
1c220 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
1c230 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
1c240 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
1c250 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1c260 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
1c270 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
1c280 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
1c290 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  rse, pF->iDistin
1c2a0 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
1c2b0 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
1c2c0 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
1c2d0 63 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  c->flags & SQLIT
1c2e0 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
1c2f0 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
1c300 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
1c310 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1c320 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1c330 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
1c340 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
1c350 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
1c360 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
1c370 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f   has NEEDCOLL */
1c380 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
1c390 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
1c3a0 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
1c3b0 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
1c3c0 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
1c3d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
1c3e0 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
1c3f0 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
1c400 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
1c410 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
1c420 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
1c430 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
1c440 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1c450 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1c460 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20   OP_CollSeq, 0, 
1c470 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
1c480 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
1c490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1c4a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1c4b0 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20   OP_AggStep, 0, 
1c4c0 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d  regAgg, pF->iMem
1c4d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c4e0 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
1c4f0 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
1c500 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  CDEF);.    sqlit
1c510 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1c520 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  , nArg);.    sql
1c530 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1c540 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
1c550 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
1c560 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1c570 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
1c580 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
1c590 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64  Arg);.    if( ad
1c5a0 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  drNext ){.      
1c5b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1c5c0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e  veLabel(v, addrN
1c5d0 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ext);.    }.  }.
1c5e0 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41    for(i=0, pC=pA
1c5f0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c  ggInfo->aCol; i<
1c600 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
1c610 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b  ulator; i++, pC+
1c620 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  +){.    sqlite3E
1c630 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1c640 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69  pC->pExpr, pC->i
1c650 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67  Mem);.  }.  pAgg
1c660 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65  Info->directMode
1c670 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = 0;.}../*.** G
1c680 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1c690 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1c6a0 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
1c6b0 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
1c6c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
1c6d0 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
1c6e0 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
1c6f0 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
1c700 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1c710 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  of the SelectDes
1c720 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  t structure poin
1c730 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65  ted to by argume
1c740 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66  nt pDest.** as f
1c750 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1c760 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20    pDest->eDest  
1c770 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20    Result.**     
1c780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
1c790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c7a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c7b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
1c7c0 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20 20     SRT_Output   
1c7d0 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 72 6f     Generate a ro
1c7e0 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73 69  w of output (usi
1c7f0 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74  ng the OP_Result
1c800 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  Row.**          
1c810 20 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f 64             opcod
1c820 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  e) for each row 
1c830 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1c840 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
1c850 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e 6c  _Mem         Onl
1c860 79 20 76 61 6c 69 64 20 69 66 20 74 68 65 20 72  y valid if the r
1c870 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67 6c  esult is a singl
1c880 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20  e column..**    
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8a0 20 53 74 6f 72 65 20 74 68 65 20 66 69 72 73 74   Store the first
1c8b0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
1c8c0 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77 0a  irst result row.
1c8d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1c8e0 20 20 20 20 20 20 20 69 6e 20 72 65 67 69 73 74         in regist
1c8f0 65 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  er pDest->iParm 
1c900 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74 68 65  then abandon the
1c910 20 72 65 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   rest.**        
1c920 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1c930 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73  the query.  This
1c940 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 6d 70   destination imp
1c950 6c 69 65 73 20 22 4c 49 4d 49 54 20 31 22 2e 0a  lies "LIMIT 1"..
1c960 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
1c970 74 20 20 20 20 20 20 20 20 20 54 68 65 20 72 65  t         The re
1c980 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61 20 73  sult must be a s
1c990 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 53  ingle column.  S
1c9a0 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20 20 20  tore each.**    
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9c0 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 20 61   row of result a
1c9d0 73 20 74 68 65 20 6b 65 79 20 69 6e 20 74 61 62  s the key in tab
1c9e0 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e  le pDest->iParm.
1c9f0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
1ca00 20 20 20 20 20 20 20 20 20 41 70 70 6c 79 20 74           Apply t
1ca10 68 65 20 61 66 66 69 6e 69 74 79 20 70 44 65 73  he affinity pDes
1ca20 74 2d 3e 61 66 66 69 6e 69 74 79 20 62 65 66 6f  t->affinity befo
1ca30 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 20 20  re storing.**   
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca50 20 20 72 65 73 75 6c 74 73 2e 20 20 55 73 65 64    results.  Used
1ca60 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 49   to implement "I
1ca70 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e  N (SELECT ...)".
1ca80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55  .**.**     SRT_U
1ca90 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72 65  nion       Store
1caa0 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b 65   results as a ke
1cab0 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  y in a temporary
1cac0 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
1cad0 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
1cae0 52 54 5f 45 78 63 65 70 74 20 20 20 20 20 20 52  RT_Except      R
1caf0 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20 66 72  emove results fr
1cb00 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  om the temporary
1cb10 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 50   table pDest->iP
1cb20 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  arm..**.**     S
1cb30 52 54 5f 54 61 62 6c 65 20 20 20 20 20 20 20 53  RT_Table       S
1cb40 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20  tore results in 
1cb50 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1cb60 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
1cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb80 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b       This is lik
1cb90 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 65  e SRT_EphemTab e
1cba0 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74  xcept that the t
1cbb0 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  able.**         
1cbc0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 61              is a
1cbd0 73 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61 64  ssumed to alread
1cbe0 79 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a  y be open..**.**
1cbf0 20 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61       SRT_EphemTa
1cc00 62 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74  b    Create an t
1cc10 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70  emporary table p
1cc20 44 65 73 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20  Dest->iParm and 
1cc30 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  store.**        
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
1cc50 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20 54   result there. T
1cc60 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1cc70 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20  t open after.** 
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc90 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20 20      returning.  
1cca0 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54  This is like SRT
1ccb0 5f 54 61 62 6c 65 20 65 78 63 65 70 74 20 74 68  _Table except th
1ccc0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
1ccd0 20 20 20 20 20 20 20 20 20 20 74 68 69 73 20 64            this d
1cce0 65 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73 20  estination uses 
1ccf0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
1cd00 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20 20   to create.**   
1cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd20 20 20 74 68 65 20 74 61 62 6c 65 20 66 69 72 73    the table firs
1cd30 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
1cd40 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65 6e  _Coroutine   Gen
1cd50 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74 69  erate a co-routi
1cd60 6e 65 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ne that returns 
1cd70 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a 20  a new row of.** 
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd90 20 20 20 20 72 65 73 75 6c 74 73 20 65 61 63 68      results each
1cda0 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76 6f   time it is invo
1cdb0 6b 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79 20  ked.  The entry 
1cdc0 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  point.**        
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1cde0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69  the co-routine i
1cdf0 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69  s stored in regi
1ce00 73 74 65 72 20 70 44 65 73 74 2d 3e 69 50 61 72  ster pDest->iPar
1ce10 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  m..**.**     SRT
1ce20 5f 45 78 69 73 74 73 20 20 20 20 20 20 53 74 6f  _Exists      Sto
1ce30 72 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79  re a 1 in memory
1ce40 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61   cell pDest->iPa
1ce50 72 6d 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  rm if the result
1ce60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1ce70 20 20 20 20 20 20 20 20 73 65 74 20 69 73 20 6e          set is n
1ce80 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  ot empty..**.** 
1ce90 20 20 20 20 53 52 54 5f 44 69 73 63 61 72 64 20      SRT_Discard 
1cea0 20 20 20 20 54 68 72 6f 77 20 74 68 65 20 72 65      Throw the re
1ceb0 73 75 6c 74 73 20 61 77 61 79 2e 20 20 54 68 69  sults away.  Thi
1cec0 73 20 69 73 20 75 73 65 64 20 62 79 20 53 45 4c  s is used by SEL
1ced0 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ECT.**          
1cee0 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
1cef0 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69  ments within tri
1cf00 67 67 65 72 73 20 77 68 6f 73 65 20 6f 6e 6c 79  ggers whose only
1cf10 20 70 75 72 70 6f 73 65 20 69 73 0a 2a 2a 20 20   purpose is.**  
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf30 20 20 20 74 68 65 20 73 69 64 65 2d 65 66 66 65     the side-effe
1cf40 63 74 73 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73  cts of functions
1cf50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1cf60 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
1cf70 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
1cf80 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
1cf90 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
1cfa0 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
1cfb0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
1cfc0 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
1cfd0 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
1cfe0 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
1cff0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
1d000 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
1d010 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
1d020 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
1d030 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1d040 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
1d050 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1d060 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
1d070 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1d080 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
1d090 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1d0a0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1d0b0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
1d0c0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
1d0d0 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65  g coded. */.  Se
1d0e0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
1d0f0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
1d100 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72  do with the quer
1d110 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
1d120 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
1d130 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1d140 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
1d150 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1d160 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
1d170 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
1d180 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
1d190 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
1d1a0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
1d1b0 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
1d1c0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
1d1d0 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
1d1e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d1f0 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
1d200 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
1d210 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
1d220 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
1d230 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
1d240 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
1d250 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
1d260 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
1d270 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
1d280 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
1d290 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
1d2a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1d2b0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
1d2c0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
1d2d0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1d2e0 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y;    /* The ORD
1d2f0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  ER BY clause.  M
1d300 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1d310 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
1d320 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
1d330 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
1d340 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
1d350 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
1d360 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
1d370 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
1d380 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
1d390 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 3b 20  int isDistinct; 
1d3a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1d3b0 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
1d3c0 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
1d3d0 74 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73 74 69  t */.  int disti
1d3e0 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  nct;          /*
1d3f0 20 54 61 62 6c 65 20 74 6f 20 75 73 65 20 66 6f   Table to use fo
1d400 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
1d410 65 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  et */.  int rc =
1d420 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
1d430 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
1d440 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
1d450 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
1d460 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
1d470 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
1d480 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  n OP_OpenEphemer
1d490 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
1d4a0 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67  /.  AggInfo sAgg
1d4b0 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Info;      /* In
1d4c0 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62  formation used b
1d4d0 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  y aggregate quer
1d4e0 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  ies */.  int iEn
1d4f0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1d500 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1d510 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65  e end of the que
1d520 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
1d530 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
1d540 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
1d550 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
1d560 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1d570 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
1d580 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1d590 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
1d5a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1d5b0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1d5c0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1d5d0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
1d5e0 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
1d5f0 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
1d600 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
1d610 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
1d620 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  ;..  pOrderBy = 
1d630 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
1d640 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
1d650 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
1d660 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
1d670 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68  0;..    /* In th
1d680 65 73 65 20 63 61 73 65 73 20 74 68 65 20 44 49  ese cases the DI
1d690 53 54 49 4e 43 54 20 6f 70 65 72 61 74 6f 72 20  STINCT operator 
1d6a0 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65  makes no differe
1d6b0 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  nce to the.    *
1d6c0 2a 20 72 65 73 75 6c 74 73 2c 20 73 6f 20 72 65  * results, so re
1d6d0 6d 6f 76 65 20 69 74 20 69 66 20 69 74 20 77 65  move it if it we
1d6e0 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  re specified..  
1d6f0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1d700 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1d710 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
1d720 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
1d730 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
1d740 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
1d750 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
1d760 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1d770 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20 70  _Discard);.    p
1d780 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
1d790 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
1d7a0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
1d7b0 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
1d7c0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
1d7d0 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 67 6f 74  >nErr ){.    got
1d7e0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
1d7f0 7d 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  }.  p->pOrderBy 
1d800 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 0a 20 20  = pOrderBy;...  
1d810 2f 2a 20 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f  /* Make local co
1d820 70 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 61  pies of the para
1d830 6d 65 74 65 72 73 20 66 6f 72 20 74 68 69 73 20  meters for this 
1d840 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54  query..  */.  pT
1d850 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
1d860 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e  ;.  isAgg = (p->
1d870 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
1d880 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 70  gregate)!=0;.  p
1d890 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
1d8a0 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d  t;.  if( pEList=
1d8b0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
1d8c0 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  _end;..  /* .  *
1d8d0 2a 20 44 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74  * Do not even at
1d8e0 74 65 6d 70 74 20 74 6f 20 67 65 6e 65 72 61 74  tempt to generat
1d8f0 65 20 61 6e 79 20 63 6f 64 65 20 69 66 20 77 65  e any code if we
1d900 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73 65   have already se
1d910 65 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 73 20 62  en.  ** errors b
1d920 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
1d930 6e 65 20 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a  ne starts..  */.
1d940 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1d950 72 72 3e 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  rr>0 ) goto sele
1d960 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 4f 52  ct_end;..  /* OR
1d970 44 45 52 20 42 59 20 69 73 20 69 67 6e 6f 72 65  DER BY is ignore
1d980 64 20 66 6f 72 20 73 6f 6d 65 20 64 65 73 74 69  d for some desti
1d990 6e 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nations..  */.  
1d9a0 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64  if( IgnorableOrd
1d9b0 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
1d9c0 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
1d9d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
1d9e0 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65   generating code
1d9f0 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
1da00 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1da10 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
1da20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1da30 64 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  d;..  /* Generat
1da40 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
1da50 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68  ub-queries in th
1da60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
1da70 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1da80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1da90 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
1daa0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
1dab0 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21  EW).  for(i=0; !
1dac0 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70  p->pPrior && i<p
1dad0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1dae0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
1daf0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1db00 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
1db10 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
1db20 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
1db30 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
1db40 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
1db50 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b     int isAggSub;
1db60 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  ..    if( pSub==
1db70 30 20 7c 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f  0 || pItem->isPo
1db80 70 75 6c 61 74 65 64 20 29 20 63 6f 6e 74 69 6e  pulated ) contin
1db90 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72  ue;..    /* Incr
1dba0 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
1dbb0 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
1dbc0 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
1dbd0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
1dbe0 2a 2a 20 74 72 65 65 20 72 65 66 65 72 65 64 20  ** tree refered 
1dbf0 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
1dc00 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
1dc10 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
1dc20 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
1dc30 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
1dc40 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
1dc50 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
1dc60 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
1dc70 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
1dc80 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
1dc90 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
1dca0 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
1dcb0 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
1dcc0 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
1dcd0 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
1dce0 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
1dcf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
1dd00 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
1dd10 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
1dd20 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
1dd30 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
1dd40 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1dd50 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
1dd60 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e  into the parent.
1dd70 20 2a 2f 0a 20 20 20 20 69 73 41 67 67 53 75 62   */.    isAggSub
1dd80 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61   = (pSub->selFla
1dd90 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
1dda0 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66  e)!=0;.    if( f
1ddb0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
1ddc0 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41  Parse, p, i, isA
1ddd0 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b  gg, isAggSub) ){
1dde0 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67  .      if( isAgg
1ddf0 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Sub ){.        i
1de00 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
1de10 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
1de20 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
1de30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
1de40 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
1de50 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
1de60 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
1de70 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
1de80 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
1de90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1dea0 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74  pItem->isPopulat
1deb0 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ed==0 );.      s
1dec0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1ded0 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
1dee0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
1def0 69 73 50 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b  isPopulated = 1;
1df00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1df10 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
1df20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1df30 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
1df40 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a  lect_end;.    }.
1df50 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
1df60 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65  ght -= sqlite3Se
1df70 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
1df80 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20  );.    pTabList 
1df90 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69  = p->pSrc;.    i
1dfa0 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64  f( !IgnorableOrd
1dfb0 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
1dfc0 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
1dfd0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
1dfe0 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20   }.  }.  pEList 
1dff0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e  = p->pEList;.#en
1e000 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70  dif.  pWhere = p
1e010 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f  ->pWhere;.  pGro
1e020 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
1e030 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20  By;.  pHaving = 
1e040 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 69 73  p->pHaving;.  is
1e050 44 69 73 74 69 6e 63 74 20 3d 20 28 70 2d 3e 73  Distinct = (p->s
1e060 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1e070 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e  tinct)!=0;..#ifn
1e080 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e090 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
1e0a0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1e0b0 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
1e0c0 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
1e0d0 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
1e0e0 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
1e0f0 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
1e100 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
1e110 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  most==0 ){.     
1e120 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20   Select *pLoop, 
1e130 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  *pRight = 0;.   
1e140 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
1e150 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65        int mxSele
1e160 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c  ct;.      for(pL
1e170 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
1e180 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
1e190 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20  r, cnt++){.     
1e1a0 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74     pLoop->pRight
1e1b0 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  most = p;.      
1e1c0 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d    pLoop->pNext =
1e1d0 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
1e1e0 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b   pRight = pLoop;
1e1f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
1e200 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c  xSelect = db->aL
1e210 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
1e220 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
1e230 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  T];.      if( mx
1e240 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78  Select && cnt>mx
1e250 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
1e260 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1e270 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
1e280 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d  any terms in com
1e290 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a  pound SELECT");.
1e2a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
1e2b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e2c0 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
1e2d0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
1e2e0 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 23 65  , pDest);.  }.#e
1e2f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 72  ndif..  /* If wr
1e300 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20  iting to memory 
1e310 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20  or generating a 
1e320 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20  set.  ** only a 
1e330 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61  single column ma
1e340 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  y be output..  *
1e350 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1e360 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1e370 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c   if( checkForMul
1e380 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72  tiColumnSelectEr
1e390 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73  ror(pParse, pDes
1e3a0 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t, pEList->nExpr
1e3b0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  ) ){.    goto se
1e3c0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65  lect_end;.  }.#e
1e3d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f  ndif..  /* If po
1e3e0 73 73 69 62 6c 65 2c 20 72 65 77 72 69 74 65 20  ssible, rewrite 
1e3f0 74 68 65 20 71 75 65 72 79 20 74 6f 20 75 73 65  the query to use
1e400 20 47 52 4f 55 50 20 42 59 20 69 6e 73 74 65 61   GROUP BY instea
1e410 64 20 6f 66 20 44 49 53 54 49 4e 43 54 2e 0a 20  d of DISTINCT.. 
1e420 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 6d 69 67   ** GROUP BY mig
1e430 68 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 2c  ht use an index,
1e440 20 44 49 53 54 49 4e 43 54 20 6e 65 76 65 72 20   DISTINCT never 
1e450 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  does..  */.  if(
1e460 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1e470 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1e480 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
1e490 44 69 73 74 69 6e 63 74 20 26 26 20 21 70 2d 3e  Distinct && !p->
1e4a0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
1e4b0 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  p->pGroupBy = sq
1e4c0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1e4d0 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
1e4e0 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
1e4f0 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
1e500 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
1e510 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
1e520 20 20 69 73 44 69 73 74 69 6e 63 74 20 3d 20 30    isDistinct = 0
1e530 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1e540 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
1e550 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1e560 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20   this sorting.  
1e570 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65  ** index might e
1e580 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73  nd up being unus
1e590 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63  ed if the data c
1e5a0 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72  an be .  ** extr
1e5b0 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
1e5c0 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74  ted order.  If t
1e5d0 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c  hat is the case,
1e5e0 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f   then the.  ** O
1e5f0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1e600 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c  instruction will
1e610 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
1e620 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20  n OP_Noop once. 
1e630 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75   ** we figure ou
1e640 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69  t that the sorti
1e650 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20  ng index is not 
1e660 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64  needed.  The add
1e670 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20  rSortIndex.  ** 
1e680 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
1e690 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
1e6a0 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f  hat change..  */
1e6b0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
1e6c0 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
1e6d0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b  pKeyInfo;.    pK
1e6e0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
1e6f0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
1e700 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a  rse, pOrderBy);.
1e710 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45      pOrderBy->iE
1e720 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
1e730 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e  >nTab++;.    p->
1e740 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
1e750 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  = addrSortIndex 
1e760 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  =.      sqlite3V
1e770 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1e780 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20  OpenEphemeral,. 
1e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7a0 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
1e7b0 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f  By->iECursor, pO
1e7c0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
1e7d0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1e7f0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
1e800 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
1e810 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FF);.  }else{.  
1e820 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20    addrSortIndex 
1e830 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
1e840 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
1e850 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
1e860 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
1e870 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
1e880 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
1e890 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
1e8a0 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
1e8b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e8c0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
1e8d0 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61  eral, pDest->iPa
1e8e0 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
1e8f0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
1e900 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
1e910 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
1e920 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1e930 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c  l(v);.  computeL
1e940 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
1e950 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a  arse, p, iEnd);.
1e960 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72  .  /* Open a vir
1e970 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  tual index to us
1e980 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
1e990 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
1e9a0 66 28 20 69 73 44 69 73 74 69 6e 63 74 20 29 7b  f( isDistinct ){
1e9b0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
1e9c0 65 79 49 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65  eyInfo;.    asse
1e9d0 72 74 28 20 69 73 41 67 67 20 7c 7c 20 70 47 72  rt( isAgg || pGr
1e9e0 6f 75 70 42 79 20 29 3b 0a 20 20 20 20 64 69 73  oupBy );.    dis
1e9f0 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
1ea00 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79  nTab++;.    pKey
1ea10 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
1ea20 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
1ea30 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  e, p->pEList);. 
1ea40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ea50 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
1ea60 70 68 65 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e  phemeral, distin
1ea70 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
1eaa0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  o, P4_KEYINFO_HA
1eab0 4e 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b  NDOFF);.  }else{
1eac0 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d 20  .    distinct = 
1ead0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67  -1;.  }..  /* Ag
1eae0 67 72 65 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d  gregate and non-
1eaf0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
1eb00 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 64 69  s are handled di
1eb10 66 66 65 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69  fferently */.  i
1eb20 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72  f( !isAgg && pGr
1eb30 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
1eb40 2f 2a 20 54 68 69 73 20 63 61 73 65 20 69 73 20  /* This case is 
1eb50 66 6f 72 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74  for non-aggregat
1eb60 65 20 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2a  e queries.    **
1eb70 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
1eb80 61 73 65 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a  ase scan.    */.
1eb90 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
1eba0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
1ebb0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
1ebc0 20 70 57 68 65 72 65 2c 20 26 70 4f 72 64 65 72   pWhere, &pOrder
1ebd0 42 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  By, 0);.    if( 
1ebe0 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
1ebf0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
1ec00 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
1ec10 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
1ec20 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
1ec30 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
1ec40 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
1ec50 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
1ec60 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
1ec70 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
1ec80 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
1ec90 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
1eca0 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
1ecb0 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f  /.    if( addrSo
1ecc0 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f  rtIndex>=0 && pO
1ecd0 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
1ece0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1ecf0 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
1ed00 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 31 29 3b  drSortIndex, 1);
1ed10 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
1ed20 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a  enEphm[2] = -1;.
1ed30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
1ed40 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
1ed50 6e 6e 65 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f  nner loop.    */
1ed60 0a 20 20 20 20 61 73 73 65 72 74 28 21 69 73 44  .    assert(!isD
1ed70 69 73 74 69 6e 63 74 29 3b 0a 20 20 20 20 73 65  istinct);.    se
1ed80 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
1ed90 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
1eda0 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79 2c   0, 0, pOrderBy,
1edb0 20 2d 31 2c 20 70 44 65 73 74 2c 0a 20 20 20 20   -1, pDest,.    
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edd0 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
1ede0 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  e, pWInfo->iBrea
1edf0 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20  k);..    /* End 
1ee00 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
1ee10 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
1ee20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
1ee30 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65  nd(pWInfo);.  }e
1ee40 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
1ee50 20 69 73 20 74 68 65 20 70 72 6f 63 65 73 73 69   is the processi
1ee60 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
1ee70 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 20 20   queries */.    
1ee80 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
1ee90 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
1eea0 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ext for processi
1eeb0 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66  ng aggregate inf
1eec0 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
1eed0 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20  int iAMem;      
1eee0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
1eef0 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f   address for sto
1ef00 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f  ring current GRO
1ef10 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
1ef20 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iBMem;         
1ef30 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
1ef40 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f  dress for previo
1ef50 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  us GROUP BY */. 
1ef60 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b     int iUseFlag;
1ef70 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64         /* Mem ad
1ef80 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c  dress holding fl
1ef90 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ag indicating th
1efa0 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20  at at least.    
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efc0 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f      ** one row o
1efd0 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74  f the input to t
1efe0 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61  he aggregator ha
1eff0 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20  s been.         
1f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f010 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  * processed */. 
1f020 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61     int iAbortFla
1f030 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64  g;     /* Mem ad
1f040 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73  dress which caus
1f050 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69  es query abort i
1f060 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20  f positive */.  
1f070 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72    int groupBySor
1f080 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f  t;    /* Rows co
1f090 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69  me from source i
1f0a0 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
1f0b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
1f0c0 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  End;        /* E
1f0d0 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67  nd of processing
1f0e0 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
1f0f0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f   */..    /* Remo
1f100 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61  ve any and all a
1f110 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74  liases between t
1f120 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
1f130 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f  d the.    ** GRO
1f140 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  UP BY clause..  
1f150 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
1f160 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69  oupBy ){.      i
1f170 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1f180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f190 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1f1a0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
1f1b0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1f1c0 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  m;  /* For loopi
1f1d0 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69  ng over expressi
1f1e0 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a  on in a list */.
1f1f0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e  .      for(i=p->
1f200 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
1f210 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Item=p->pEList->
1f220 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
1f230 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
1f240 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30  Item->iAlias = 0
1f250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f260 66 6f 72 28 69 3d 70 47 72 6f 75 70 42 79 2d 3e  for(i=pGroupBy->
1f270 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72  nExpr, pItem=pGr
1f280 6f 75 70 42 79 2d 3e 61 3b 20 69 3e 30 3b 20 69  oupBy->a; i>0; i
1f290 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
1f2a0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c        pItem->iAl
1f2b0 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
1f2c0 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a  .    }.. .    /*
1f2d0 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20   Create a label 
1f2e0 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20  to jump to when 
1f2f0 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74  we want to abort
1f300 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
1f310 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69    addrEnd = sqli
1f320 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1f330 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  (v);..    /* Con
1f340 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  vert TK_COLUMN n
1f350 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47  odes into TK_AGG
1f360 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65  _COLUMN and make
1f370 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20   entries in.    
1f380 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20  ** sAggInfo for 
1f390 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  all TK_AGG_FUNCT
1f3a0 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70  ION nodes in exp
1f3b0 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ressions of the.
1f3c0 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74      ** SELECT st
1f3d0 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a  atement..    */.
1f3e0 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
1f3f0 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
1f400 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
1f410 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
1f420 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
1f430 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e  abList;.    sNC.
1f440 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67  pAggInfo = &sAgg
1f450 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e  Info;.    sAggIn
1f460 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
1f470 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
1f480 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31  GroupBy->nExpr+1
1f490 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
1f4a0 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
1f4b0 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
1f4c0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
1f4d0 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
1f4e0 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
1f4f0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
1f500 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42  st(&sNC, pOrderB
1f510 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76  y);.    if( pHav
1f520 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
1f530 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
1f540 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
1f550 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a  pHaving);.    }.
1f560 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63      sAggInfo.nAc
1f570 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67  cumulator = sAgg
1f580 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Info.nColumn;.  
1f590 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
1f5a0 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b  gInfo.nFunc; i++
1f5b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f5c0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
1f5d0 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66  st(&sNC, sAggInf
1f5e0 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
1f5f0 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  ->pList);.    }.
1f600 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
1f610 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
1f620 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20  select_end;..   
1f630 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66   /* Processing f
1f640 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69  or aggregates wi
1f650 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76  th GROUP BY is v
1f660 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e  ery different an
1f670 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f  d.    ** much mo
1f680 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20  re complex than 
1f690 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f  aggregates witho
1f6a0 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20  ut a GROUP BY.. 
1f6b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
1f6c0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
1f6d0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1f6e0 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e  o;  /* Keying in
1f6f0 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
1f700 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73  e group by claus
1f710 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  e */.      int j
1f720 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
1f730 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69  * A-vs-B compari
1f740 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20  sion jump */.   
1f750 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75     int addrOutpu
1f760 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20  tRow;  /* Start 
1f770 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  of subroutine th
1f780 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73  at outputs a res
1f790 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ult row */.     
1f7a0 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f   int regOutputRo
1f7b0 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  w;   /* Return a
1f7c0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
1f7d0 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f  for output subro
1f7e0 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  utine */.      i
1f7f0 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b  nt addrSetAbort;
1f800 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
1f810 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
1f820 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  urn */.      int
1f830 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
1f840 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
1f850 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
1f860 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
1f870 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50  ngIdx; /* The OP
1f880 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66  _OpenEphemeral f
1f890 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  or the sorting i
1f8a0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
1f8b0 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
1f8c0 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
1f8d0 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
1f8e0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
1f8f0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
1f900 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  set;       /* Re
1f910 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
1f920 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20  ister for reset 
1f930 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  subroutine */.. 
1f940 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
1f950 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
1f960 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
1f970 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
1f980 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
1f990 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
1f9a0 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
1f9b0 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
1f9c0 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
1f9d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
1f9e0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
1f9f0 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
1fa00 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
1fa10 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20  struction.      
1fa20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  ** will be conve
1fa30 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70  rted into a Noop
1fa40 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  .  .      */.   
1fa50 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
1fa60 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d  ingIdx = pParse-
1fa70 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
1fa80 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
1fa90 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
1faa0 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 29 3b  arse, pGroupBy);
1fab0 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
1fac0 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
1fad0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1fae0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a  OpenEphemeral, .
1faf0 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
1fb00 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
1fb10 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
1fb20 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20  Column, .       
1fb30 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65     0, (char*)pKe
1fb40 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
1fb50 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20  O_HANDOFF);..   
1fb60 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
1fb70 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
1fb80 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
1fb90 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
1fba0 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
1fbb0 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
1fbc0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1fbd0 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
1fbe0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
1fbf0 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75  Mem;.      regOu
1fc00 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72  tputRow = ++pPar
1fc10 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1fc20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
1fc30 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1fc40 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72  abel(v);.      r
1fc50 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72  egReset = ++pPar
1fc60 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1fc70 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
1fc80 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1fc90 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  (v);.      iAMem
1fca0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
1fcb0 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
1fcc0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
1fcd0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
1fce0 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
1fcf0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
1fd00 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1fd10 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
1fd20 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
1fd30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1fd40 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
1fd50 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
1fd60 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
1fd70 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
1fd80 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
1fd90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1fda0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
1fdb0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
1fdc0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1fdd0 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
1fde0 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
1fdf0 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
1fe00 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
1fe10 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
1fe20 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
1fe30 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
1fe40 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
1fe50 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
1fe60 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
1fe70 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
1fe80 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
1fe90 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
1fea0 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
1feb0 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
1fec0 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
1fed0 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
1fee0 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
1fef0 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
1ff00 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
1ff10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ff20 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1ff30 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
1ff40 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49  eset);.      pWI
1ff50 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
1ff60 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
1ff70 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
1ff80 2c 20 26 70 47 72 6f 75 70 42 79 2c 20 30 29 3b  , &pGroupBy, 0);
1ff90 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
1ffa0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
1ffb0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
1ffc0 28 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  ( pGroupBy==0 ){
1ffd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1ffe0 6f 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c  optimizer is abl
1fff0 65 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77  e to deliver row
20000 73 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72  s in group by or
20010 64 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a  der so.        *
20020 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65  * we do not have
20030 20 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f   to sort.  The O
20040 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
20050 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20  table will be.  
20060 20 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c        ** cancell
20070 65 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65  ed later because
20080 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
20090 6f 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e  o use the pKeyIn
200a0 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  fo.        */.  
200b0 20 20 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d        pGroupBy =
200c0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
200d0 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
200e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
200f0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52  se{.        /* R
20100 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f  ows are coming o
20110 75 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e  ut in undetermin
20120 65 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61  ed order.  We ha
20130 76 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20  ve to push.     
20140 20 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69     ** each row i
20150 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  nto a sorting in
20160 64 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74  dex, terminate t
20170 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20  he first loop,. 
20180 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c         ** then l
20190 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72  oop over the sor
201a0 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72  ting index in or
201b0 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f  der to get the o
201c0 75 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a  utput.        **
201d0 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
201e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
201f0 20 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b      int regBase;
20200 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
20210 52 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20  Record;.        
20220 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  int nCol;.      
20230 20 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a    int nGroupBy;.
20240 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
20250 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sort = 1;.      
20260 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72    nGroupBy = pGr
20270 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
20280 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72        nCol = nGr
20290 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20  oupBy + 1;.     
202a0 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b     j = nGroupBy+
202b0 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
202c0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
202d0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
202e0 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67          if( sAgg
202f0 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f  Info.aCol[i].iSo
20300 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
20310 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
20320 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l++;.           
20330 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
20340 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
20350 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71      regBase = sq
20360 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
20370 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
20380 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20390 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
203a0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
203b0 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a  y, regBase, 0);.
203c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
203d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
203e0 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e  Sequence, sAggIn
203f0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65  fo.sortingIdx,re
20400 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b  gBase+nGroupBy);
20410 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
20420 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20  oupBy+1;.       
20430 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
20440 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
20450 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
20460 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
20470 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e   *pCol = &sAggIn
20480 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  fo.aCol[i];.    
20490 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
204a0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
204b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
204c0 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67  int r1 = j + reg
204d0 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Base;.          
204e0 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20    int r2;..     
204f0 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
20500 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
20510 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20  lumn(pParse, .  
20520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20530 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
20540 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69  l->pTab, pCol->i
20550 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54  Column, pCol->iT
20560 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20  able, r1, 0);.  
20570 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31            if( r1
20580 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20  !=r2 ){.        
20590 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
205a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
205b0 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20  opy, r2, r1);.  
205c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
205d0 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
205e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
205f0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65   }.        regRe
20600 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
20610 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
20620 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20630 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
20640 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
20650 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67  gBase, nCol, reg
20660 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
20670 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20680 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
20690 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  rt, sAggInfo.sor
206a0 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f  tingIdx, regReco
206b0 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
206c0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
206d0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
206e0 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
206f0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
20700 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
20710 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20  egBase, nCol);. 
20720 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
20730 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
20740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20750 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20760 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
20770 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
20780 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
20790 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
207a0 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a  OUP BY sort"));.
207b0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
207c0 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
207d0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
207e0 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
207f0 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
20800 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74   BY terms and st
20810 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62  ore in b0, b1, b
20820 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62  2....      ** (b
20830 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  0 is memory loca
20840 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31  tion iBMem+0, b1
20850 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64   is iBMem+1, and
20860 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20   so forth).     
20870 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65   ** Then compare
20880 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
20890 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  UP BY terms agai
208a0 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  nst the GROUP BY
208b0 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20   terms.      ** 
208c0 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
208d0 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  s row currently 
208e0 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31  stored in a0, a1
208f0 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  , a2....      */
20900 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66  .      addrTopOf
20910 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
20920 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
20930 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
20940 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
20950 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
20960 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
20970 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
20980 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
20990 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
209a0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
209b0 64 78 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b  dx, j, iBMem+j);
209c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
209d0 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
209e0 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  fo.directMode = 
209f0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  1;.          sql
20a00 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
20a10 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61  rse, pGroupBy->a
20a20 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d  [j].pExpr, iBMem
20a30 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +j);.        }. 
20a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
20a50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
20a60 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41  , OP_Compare, iA
20a70 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f  Mem, iBMem, pGro
20a80 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  upBy->nExpr,.   
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20aa0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
20ab0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
20ac0 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20  FO);.      j1 = 
20ad0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
20ae0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
20af0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20b00 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
20b10 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a  1+1, 0, j1+1);..
20b20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
20b30 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
20b40 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
20b50 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
20b60 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73        ** Changes
20b70 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
20b80 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
20b90 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
20ba0 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
20bb0 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
20bc0 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
20bd0 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
20be0 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
20bf0 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
20c00 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
20c10 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
20c20 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
20c30 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
20c40 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
20c50 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
20c60 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
20c70 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
20c80 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
20c90 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
20ca0 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
20cb0 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
20cc0 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
20cd0 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
20ce0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
20cf0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
20d00 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41  Parse, iBMem, iA
20d10 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
20d20 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
20d30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20d40 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
20d50 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
20d60 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
20d70 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
20d80 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22  "output one row"
20d90 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
20da0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20db0 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46  P_IfPos, iAbortF
20dc0 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  lag, addrEnd);. 
20dd0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
20de0 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72  ((v, "check abor
20df0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
20e00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20e10 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
20e20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
20e30 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
20e40 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
20e50 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
20e60 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
20e70 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
20e80 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
20e90 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
20ea0 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
20eb0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
20ec0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
20ed0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
20ee0 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20  re(v, j1);.     
20ef0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
20f00 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
20f10 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
20f20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20f30 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
20f40 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
20f50 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
20f60 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61  , "indicate data
20f70 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22   in accumulator"
20f80 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
20f90 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  d of the loop.  
20fa0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
20fb0 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
20fc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20fd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20fe0 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
20ff0 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
21000 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
21010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21020 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
21030 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
21040 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
21050 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
21060 53 6f 72 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a  SortingIdx, 1);.
21070 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
21080 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
21090 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
210a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
210b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
210c0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
210d0 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
210e0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
210f0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
21100 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c  v, "output final
21110 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20   row"));..      
21120 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65  /* Jump over the
21130 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20   subroutines.   
21140 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
21150 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21160 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
21170 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  rEnd);..      /*
21180 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
21190 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
211a0 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  uts a single row
211b0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
211c0 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68       ** set.  Th
211d0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69  is subroutine fi
211e0 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65  rst looks at the
211f0 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69   iUseFlag.  If i
21200 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a  UseFlag.      **
21210 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
21220 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
21230 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69  the subroutine i
21240 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20  s a no-op.  If. 
21250 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63       ** the proc
21260 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72  essing calls for
21270 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61 62   the query to ab
21280 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75  ort, this subrou
21290 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tine.      ** in
212a0 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62  crements the iAb
212b0 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c  ortFlag memory l
212c0 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72  ocation before r
212d0 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20  eturning in.    
212e0 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69    ** order to si
212f0 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20  gnal the caller 
21300 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20  to abort..      
21310 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65 74  */.      addrSet
21320 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Abort = sqlite3V
21330 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
21340 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21350 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21360 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62  _Integer, 1, iAb
21370 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
21380 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
21390 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22  "set abort flag"
213a0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
213b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
213c0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
213d0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73  putRow);.      s
213e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
213f0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75  eLabel(v, addrOu
21400 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
21410 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
21420 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
21430 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
21440 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21450 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
21460 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75  iUseFlag, addrOu
21470 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20  tputRow+2);.    
21480 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
21490 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c  , "Groupby resul
214a0 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72  t generator entr
214b0 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20  y point"));.    
214c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
214d0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
214e0 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
214f0 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41  .      finalizeA
21500 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
21510 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
21520 20 20 20 20 20 20 69 66 28 20 70 48 61 76 69 6e        if( pHavin
21530 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
21540 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
21550 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
21560 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
21570 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
21580 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ULL);.      }.  
21590 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
215a0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
215b0 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  ->pEList, 0, 0, 
215c0 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  pOrderBy,.      
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215e0 64 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  distinct, pDest,
215f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21600 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75         addrOutpu
21610 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41  tRow+1, addrSetA
21620 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  bort);.      sql
21630 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
21640 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
21650 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
21660 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
21670 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72  , "end groupby r
21680 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
21690 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
216a0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
216b0 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
216c0 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
216d0 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
216e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
216f0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
21700 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74  bel(v, addrReset
21710 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
21720 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
21730 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
21740 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21750 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
21760 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20  rn, regReset);. 
21770 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e      .    } /* en
21780 64 69 66 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a  dif pGroupBy */.
21790 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20      else {.     
217a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d   ExprList *pMinM
217b0 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78  ax = 0;.      Ex
217c0 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30  prList *pDel = 0
217d0 3b 0a 20 20 20 20 20 20 75 38 20 66 6c 61 67 3b  ;.      u8 flag;
217e0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
217f0 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
21800 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
21810 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a  ollowing forms:.
21820 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21830 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  *   SELECT min(x
21840 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
21850 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78   **   SELECT max
21860 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
21870 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
21880 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73  f it is, then as
21890 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68  k the code in wh
218a0 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74  ere.c to attempt
218b0 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73   to sort results
218c0 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20  .      ** as if 
218d0 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52  there was an "OR
218e0 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52  DER ON x" or "OR
218f0 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63  DER ON x DESC" c
21900 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 2a 2a  lause. .      **
21910 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61   If where.c is a
21920 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72  ble to produce r
21930 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e  esults sorted in
21940 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65   this order, the
21950 6e 0a 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76  n.      ** add v
21960 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61  dbe code to brea
21970 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f  k out of the pro
21980 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74  cessing loop aft
21990 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  er the .      **
219a0 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
219b0 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72 73   (since the firs
219c0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
219d0 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20  he loop is .    
219e0 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
219f0 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
21a00 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d  e row with the m
21a10 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75  inimum or maximu
21a20 6d 20 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  m .      ** valu
21a30 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79  e of x, the only
21a40 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a   row required)..
21a50 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
21a60 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67  * A special flag
21a70 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20   must be passed 
21a80 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
21a90 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74  egin() to slight
21aa0 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69  ly.      ** modi
21ab0 66 79 20 62 65 68 61 76 69 6f 75 72 20 61 73 20  fy behaviour as 
21ac0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a  follows:.      *
21ad0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49  *.      **   + I
21ae0 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
21af0 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22   "SELECT min(x)"
21b00 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20  , then the loop 
21b10 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 2a  coded by.      *
21b20 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68  *     where.c sh
21b30 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65  ould not iterate
21b40 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73   over any values
21b50 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
21b60 75 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ue.      **     
21b70 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 2a 2a 0a  for x..      **.
21b80 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65        **   + The
21b90 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20   optimizer code 
21ba0 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20  in where.c (the 
21bb0 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64  thing that decid
21bc0 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a  es which.      *
21bd0 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69  *     index or i
21be0 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29 20 73  ndices to use) s
21bf0 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69  hould place a di
21c00 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79  fferent priority
21c10 20 6f 6e 20 0a 20 20 20 20 20 20 2a 2a 20 20 20   on .      **   
21c20 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65    satisfying the
21c30 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75   'ORDER BY' clau
21c40 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20  se than it does 
21c50 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a  in other cases..
21c60 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66        **     Ref
21c70 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63  er to code and c
21c80 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65  omments in where
21c90 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  .c for details..
21ca0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
21cb0 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
21cc0 79 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  y(pParse, p);.  
21cd0 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a      if( flag ){.
21ce0 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70          pDel = p
21cf0 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  MinMax = sqlite3
21d00 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
21d10 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
21d20 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20  pExpr->pList);. 
21d30 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d         if( pMinM
21d40 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  ax && !db->mallo
21d50 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
21d60 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
21d70 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66  0].sortOrder = f
21d80 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag!=WHERE_ORDER
21d90 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20  BY_MIN;.        
21da0 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
21db0 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
21dc0 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 7d  OLUMN;.        }
21dd0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
21de0 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
21df0 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
21e00 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
21e10 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
21e20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
21e30 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70  ing is much simp
21e40 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20  ler since there 
21e50 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
21e60 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66   row.      ** of
21e70 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a   output..      *
21e80 2f 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  /.      resetAcc
21e90 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
21ea0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
21eb0 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
21ec0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
21ed0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
21ee0 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78  pWhere, &pMinMax
21ef0 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20 20 20 69  , flag);.      i
21f00 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a  f( pWInfo==0 ){.
21f10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
21f20 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
21f30 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20  , pDel);.       
21f40 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
21f50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21f60 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
21f70 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
21f80 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
21f90 21 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61 67  !pMinMax && flag
21fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
21fb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
21fc0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49   OP_Goto, 0, pWI
21fd0 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20 20  nfo->iBreak);.  
21fe0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
21ff0 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69  t((v, "%s() by i
22000 6e 64 65 78 22 2c 28 66 6c 61 67 3d 3d 57 48 45  ndex",(flag==WHE
22010 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22  RE_ORDERBY_MIN?"
22020 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20  min":"max")));. 
22030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
22040 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
22050 6e 66 6f 29 3b 0a 20 20 20 20 20 20 66 69 6e 61  nfo);.      fina
22060 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
22070 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
22080 66 6f 29 3b 0a 20 20 20 20 20 20 70 4f 72 64 65  fo);.      pOrde
22090 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rBy = 0;.      i
220a0 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
220b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
220c0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
220d0 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e   pHaving, addrEn
220e0 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  d, SQLITE_JUMPIF
220f0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  NULL);.      }. 
22100 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
22110 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
22120 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
22130 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20 20   0, -1, .       
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22150 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61  Dest, addrEnd, a
22160 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
22170 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
22180 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b  elete(db, pDel);
22190 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
221a0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
221b0 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  el(v, addrEnd);.
221c0 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69      .  } /* endi
221d0 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  f aggregate quer
221e0 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  y */..  /* If th
221f0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
22200 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
22210 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
22220 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
22230 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
22240 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
22250 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
22260 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
22270 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  {.    generateSo
22280 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
22290 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , v, pEList->nEx
222a0 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a  pr, pDest);.  }.
222b0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
222c0 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65  to skip this que
222d0 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
222e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
222f0 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f  l(v, iEnd);..  /
22300 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73  * The SELECT was
22310 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
22320 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72  ded.   Set the r
22330 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a  eturn code to 0.
22340 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
22350 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f   no errors..  */
22360 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  .  rc = 0;..  /*
22370 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74   Control jumps t
22380 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72  o here if an err
22390 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
223a0 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e  d above, or upon
223b0 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
223c0 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53   coding of the S
223d0 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65  ELECT..  */.sele
223e0 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64  ct_end:..  /* Id
223f0 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61  entify column na
22400 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f  mes if results o
22410 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65  f the SELECT are
22420 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20   to be output.. 
22430 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
22440 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74  LITE_OK && pDest
22450 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
22460 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
22470 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
22480 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
22490 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20   pEList);.  }.. 
224a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
224b0 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
224c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
224d0 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
224e0 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e  aFunc);.  return
224f0 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69   rc;.}..#if defi
22500 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
22510 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  )./*.***********
22520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22560 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ****.** The foll
22570 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20 75 73  owing code is us
22580 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
22590 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
225a0 79 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20  y.  The code.** 
225b0 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65  that follows doe
225c0 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20  s not appear in 
225d0 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a  normal builds..*
225e0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
225f0 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
22600 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20 63 6f  print out the co
22610 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20  ntent of all or 
22620 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61  part of a .** pa
22630 72 73 65 20 73 74 72 75 63 74 75 72 65 73 20 73  rse structures s
22640 75 63 68 20 61 73 20 53 65 6c 65 63 74 20 6f 72  uch as Select or
22650 20 45 78 70 72 2e 20 20 53 75 63 68 20 70 72 69   Expr.  Such pri
22660 6e 74 6f 75 74 73 20 61 72 65 20 75 73 65 66 75  ntouts are usefu
22670 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67  l.** for helping
22680 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 77   to understand w
22690 68 61 74 20 69 73 20 68 61 70 70 65 6e 69 6e 67  hat is happening
226a0 20 69 6e 73 69 64 65 20 74 68 65 20 63 6f 64 65   inside the code
226b0 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75   generator.** du
226c0 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 69  ring the executi
226d0 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45  on of complex SE
226e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
226f0 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
22700 74 69 6e 65 20 61 72 65 20 6e 6f 74 20 63 61 6c  tine are not cal
22710 6c 65 64 20 61 6e 79 77 68 65 72 65 20 66 72 6f  led anywhere fro
22720 6d 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 72  m within the nor
22730 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65  mal.** code base
22740 2e 20 20 54 68 65 6e 20 61 72 65 20 69 6e 74 65  .  Then are inte
22750 6e 64 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  nded to be calle
22760 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  d from within th
22770 65 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72  e debugger.** or
22780 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20   from temporary 
22790 22 70 72 69 6e 74 66 22 20 73 74 61 74 65 6d 65  "printf" stateme
227a0 6e 74 73 20 69 6e 73 65 72 74 65 64 20 66 6f 72  nts inserted for
227b0 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76   debugging..*/.v
227c0 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e 74  oid sqlite3Print
227d0 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a 20  Expr(Expr *p){. 
227e0 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20   if( p->token.z 
227f0 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20  && p->token.n>0 
22800 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
22810 62 75 67 50 72 69 6e 74 66 28 22 28 25 2e 2a 73  bugPrintf("(%.*s
22820 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70  ", p->token.n, p
22830 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65  ->token.z);.  }e
22840 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
22850 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25 64  DebugPrintf("(%d
22860 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20  ", p->op);.  }. 
22870 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b   if( p->pLeft ){
22880 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
22890 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20 20  gPrintf(" ");.  
228a0 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78    sqlite3PrintEx
228b0 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  pr(p->pLeft);.  
228c0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68  }.  if( p->pRigh
228d0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
228e0 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22 29  DebugPrintf(" ")
228f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
22900 6e 74 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  ntExpr(p->pRight
22910 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
22920 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 22 29  DebugPrintf(")")
22930 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
22940 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 45 78  PrintExprList(Ex
22950 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
22960 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
22970 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
22980 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  pr; i++){.    sq
22990 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28 70  lite3PrintExpr(p
229a0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
229b0 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 4c 69  );.    if( i<pLi
229c0 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20  st->nExpr-1 ){. 
229d0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
229e0 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20  gPrintf(", ");. 
229f0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20     }.  }.}.void 
22a00 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65  sqlite3PrintSele
22a10 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  ct(Select *p, in
22a20 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c  t indent){.  sql
22a30 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22a40 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29 20 22  "%*sSELECT(%p) "
22a50 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29  , indent, "", p)
22a60 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74  ;.  sqlite3Print
22a70 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69  ExprList(p->pELi
22a80 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  st);.  sqlite3De
22a90 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
22aa0 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29  .  if( p->pSrc )
22ab0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65  {.    char *zPre
22ac0 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  fix;.    int i;.
22ad0 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 46      zPrefix = "F
22ae0 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ROM";.    for(i=
22af0 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  0; i<p->pSrc->nS
22b00 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
22b10 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
22b20 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
22b30 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  >pSrc->a[i];.   
22b40 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
22b50 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20 69 6e  rintf("%*s ", in
22b60 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78 29  dent+6, zPrefix)
22b70 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69 78 20  ;.      zPrefix 
22b80 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20  = "";.      if( 
22b90 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
22ba0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22bb0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 5c  3DebugPrintf("(\
22bc0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  n");.        sql
22bd0 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28  ite3PrintSelect(
22be0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
22bf0 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20  indent+10);.    
22c00 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
22c10 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c 20 69  Printf("%*s)", i
22c20 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20  ndent+8, "");.  
22c30 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49      }else if( pI
22c40 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  tem->zName ){.  
22c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
22c60 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20 70  ugPrintf("%s", p
22c70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
22c80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22c90 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20  pItem->pTab ){. 
22ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
22cb0 62 75 67 50 72 69 6e 74 66 28 22 28 74 61 62 6c  bugPrintf("(tabl
22cc0 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e  e: %s)", pItem->
22cd0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
22ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22cf0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
22d00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22d10 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 41 53  DebugPrintf(" AS
22d20 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c   %s", pItem->zAl
22d30 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ias);.      }.  
22d40 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70 53 72      if( i<p->pSr
22d50 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20  c->nSrc-1 ){.   
22d60 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
22d70 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20  gPrintf(",");.  
22d80 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
22d90 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
22da0 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  \n");.    }.  }.
22db0 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
22dc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
22dd0 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20 57  bugPrintf("%*s W
22de0 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20  HERE ", indent, 
22df0 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "");.    sqlite3
22e00 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 57 68  PrintExpr(p->pWh
22e10 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ere);.    sqlite
22e20 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
22e30 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
22e40 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
22e50 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
22e60 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50 20 42  ntf("%*s GROUP B
22e70 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  Y ", indent, "")
22e80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
22e90 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47  ntExprList(p->pG
22ea0 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c  roupBy);.    sql
22eb0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
22ec0 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  "\n");.  }.  if(
22ed0 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20   p->pHaving ){. 
22ee0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
22ef0 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56 49 4e  rintf("%*s HAVIN
22f00 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  G ", indent, "")
22f10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
22f20 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69 6e  ntExpr(p->pHavin
22f30 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
22f40 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
22f50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
22f60 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
22f70 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
22f80 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42 59 20  f("%*s ORDER BY 
22f90 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a  ", indent, "");.
22fa0 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74      sqlite3Print
22fb0 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
22fc0 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  erBy);.    sqlit
22fd0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
22fe0 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e  n");.  }.}./* En
22ff0 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  d of the structu
23000 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e  re debug printin
23010 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g code.*********
23020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23060 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
23070 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
23080 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
23090 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 2a 2f  SQLITE_DEBUG) */
230a0 0a                                               .